【问题标题】:How to sort in a listView with a Custom Adapter如何使用自定义适配器在 listView 中排序
【发布时间】:2012-07-12 01:13:33
【问题描述】:

我正在制作一个应用程序,我在其中显示状态为 ONLINE 和 OFFLINE 的人数。 目前 ListView 是根据 api 设置的。我想根据这个人的在线状态对 listView 进行排序。

例如。如果没有。的人在线,然后列表视图首先显示他们。

我在我的项目中实现了延迟加载图像。

这是我的 MainActivity.class

public class MainActivity extends Activity {

ProgressDialog dialog;

static final String URL = "Some_URL";
// XML node keys
static final String KEY_RESPONSE = "Response"; // parent node
static final String KEY_NAME = "Name";
static final String KEY_DESCRIPTION = "Description";
static final String KEY_ID = "ConsultantID";
static final String KEY_OFFLINE = "OnlineStatus";
static final String KEY_THUMB_URL = "ProfilePicture";

ListView lv;
LazyAdapter adapter;


@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    lv=(ListView)findViewById(R.id.list);




    ArrayList<HashMap<String, String>> songsList = new ArrayList<HashMap<String, String>>();


    XMLfunctions parser = new XMLfunctions();
    String xml = parser.getXmlFromUrl(URL); // getting XML from URL
    Document doc = parser.getDomElement(xml); // getting DOM element

    NodeList nl = doc.getElementsByTagName(KEY_RESPONSE);
    // looping through all song nodes <song>
    for (int i = 0; i < nl.getLength(); i++) {
        // creating new HashMap
        HashMap<String, String> map = new HashMap<String, String>();
        Element e = (Element) nl.item(i);
        // adding each child node to HashMap key => value
        map.put(KEY_NAME, parser.getValue(e, KEY_NAME));
        map.put(KEY_DESCRIPTION, parser.getValue(e, KEY_DESCRIPTION));
        map.put(KEY_ID, parser.getValue(e, KEY_ID));
        map.put(KEY_OFFLINE, parser.getValue(e, KEY_OFFLINE));
        map.put(KEY_THUMB_URL, parser.getValue(e, KEY_THUMB_URL));

        // adding HashList to ArrayList
        songsList.add(map);
    }

     adapter=new LazyAdapter(this, songsList);
       lv.setAdapter(adapter);

       lv.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> Parent, View view, int Position,
                long Id) {
            // TODO Auto-generated method stub
            @SuppressWarnings("unchecked")
            HashMap<String, String> o = (HashMap<String, String>) lv.getItemAtPosition(Position);
            Intent i = new Intent ("com.fedorvlasov.lazylist.SHOWLARGE");
            i.putExtra("ID",o.get(KEY_ID));
            i.putExtra("NAME", o.get(KEY_NAME));
            i.putExtra("DESCRIPTION",o.get(KEY_DESCRIPTION));
            i.putExtra("STATUS", o.get(KEY_OFFLINE));
            i.putExtra("IMAGE",o.get(KEY_THUMB_URL));
            startActivity(i);

            //Toast.makeText(LazyAdapter2.this, "position '" + adapter.getItem(Position) + "' was clicked.", Toast.LENGTH_LONG).show();



        }

    });

}

}

这是我的适配器类,名为 LazyAdater

public class LazyAdapter extends BaseAdapter {


private Activity activity;
private ArrayList<HashMap<String, String>> data;
private static LayoutInflater inflater=null;
public ImageLoader imageLoader; 

public LazyAdapter(Activity a, ArrayList<HashMap<String, String>> d) {
    activity = a;
    data=d;
    inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    imageLoader=new ImageLoader(activity.getApplicationContext());
}


public int getCount() {
    return data.size();
}

public Object getItem(int position) {
    return data.get(position);

}

public long getItemId(int position) {
    return position;
}



public View getView(int position, View convertView, ViewGroup parent) {
    View vi=convertView;
    if(convertView==null)
        vi = inflater.inflate(R.layout.list_row, null);


    TextView title = (TextView)vi.findViewById(R.id.title); // title name
    TextView description = (TextView)vi.findViewById(R.id.artist); // descriptiom
    TextView duration = (TextView)vi.findViewById(R.id.duration); // id
    TextView Status = (TextView)vi.findViewById(R.id.status); //status
    ImageView thumb_image=(ImageView)vi.findViewById(R.id.list_image); // thumb image

    HashMap<String, String> song = new HashMap<String, String>();
    song = data.get(position); 

    // Setting all values in listview
    title.setText(song.get(MainActivity.KEY_NAME));
    description.setText(song.get(MainActivity.KEY_DESCRIPTION));
    Status.setText(song.get(MainActivity.KEY_OFFLINE));
    duration.setText(song.get(MainActivity.KEY_ID));
    imageLoader.DisplayImage(song.get(MainActivity.KEY_THUMB_URL), thumb_image);
    return vi;


}}

我已经被一些 COMPARETOR 审查过.. 但我不明白如何实现它.. 提前谢谢..

【问题讨论】:

  • 使用树形图,它已经排序,除非您需要任何特定类型的排序。
  • 我没听懂你...你能详细说明一下吗..

标签: android sorting android-listview


【解决方案1】:

试试这个

Collections.sort(songsList, new MyCustomComparator());

public static class MyCustomComparator implements Comparator<HashMap<String, String>> {

    @Override
    public int compare(HashMap<String, String> lhs,
            HashMap<String, String> rhs) {
        if(lhs.get("onLineCheck") is true)
            return 1;
        else
            return -1;

        return 0;
    }

}

在这一行之前

adapter=new LazyAdapter(this, songsList);

【讨论】:

  • 但是在应用这个之后我并没有把所有的在线人聚集在一起......我得到一个在线然后离线然后再次在线这样..我想先把所有在线人放在一起
  • 在测试我的应用程序后,我发现在应用您的代码后,列表视图视图中的人的位置刚刚翻转。我的意思是第一个到最后一个位置,反之亦然..
  • 请参阅this 如何按名称对列表视图进行排序
猜你喜欢
  • 2011-11-11
  • 1970-01-01
  • 2013-12-28
  • 1970-01-01
  • 2016-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-20
相关资源
最近更新 更多