android listview与自定义适配器多选问题

时间:2014-06-04 08:26:01

标签: android listview custom-adapter custom-lists

我想选择一个listview项目并将文本“select”设置为“selected”,但是当我点击一个项目时,如果我在位置0选择一个项目,则会选择多个项目。模式,即0,7,14,21,如果我将视图更改为横向:它将是0,5,10,15等。

我的主要活动是:

public class two extends Activity implements OnQueryTextListener,OnItemClickListener {
GroupAdapter grpAdapter;
public static ArrayList<GroupsModel> arrayOfList;
public static ListView listView;
public static String base_url = "myurl";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.two);
    arrayOfList = new ArrayList<GroupsModel>();
    listView = (ListView) findViewById(R.id.group_listview);
    listView.setOnItemClickListener(this);
    listView.setTextFilterEnabled(true);
    new ProgressTask(two.this).execute();
}  

private class ProgressTask extends AsyncTask<String, Void, Boolean> {
    private ProgressDialog dialog;
    @SuppressWarnings("unused")
    private two activity;
    public ProgressTask(two two) {
        this.activity = two;
        context = two;
        dialog = new ProgressDialog(context);
    }
    private Context context;
    protected void onPreExecute() {
        this.dialog.setMessage("Progress start");
        this.dialog.show();
    }
    @Override
    protected void onPostExecute(final Boolean success) {
        if (dialog.isShowing()) {
            dialog.dismiss();
        }
            grpAdapter = new GroupAdapter(two.this, R.layout.two_row,arrayOfList);
        listView.setAdapter(grpAdapter);
    }
    protected Boolean doInBackground(final String... args) {
        //arrayOfList = new ArrayList<GroupsModel>();
        List<NameValuePair> params = new ArrayList<NameValuePair>();
        //params.add(new BasicNameValuePair("",""));

        JSONParser jp = new JSONParser();
        JSONArray groups_obj = jp.makeHttpRequest(base_url + "groups/all", "GET", params);
        for (int i = 0; i < groups_obj.length(); i++) {
            GroupsModel group = new GroupsModel();
            try {
                JSONObject grp = groups_obj.getJSONObject(i);
                group.setGroupId(grp.getInt("id"));
                group.setGroupname(grp.getString("name"));
                arrayOfList.add(group);
            }
            catch (JSONException e) {
                e.printStackTrace();
            }

        }
        return null;
    }
}

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
      // Inflate the menu; this adds items to the action bar if it is present.
      getMenuInflater().inflate(R.menu.main, menu);
      SearchManager searchManager = (SearchManager) getSystemService( Context.SEARCH_SERVICE );
      SearchView searchView = (SearchView) menu.findItem(R.id.menu_item_search).getActionView();
      searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
      searchView.setSubmitButtonEnabled(false);
      searchView.setOnQueryTextListener(this);
      return super.onCreateOptionsMenu(menu);
 }

 @Override
 public boolean onQueryTextChange(String newText)
 {
      // this is your adapter that will be filtered
      if (TextUtils.isEmpty(newText))
      {
            listView.clearTextFilter();
      }
      grpAdapter.getFilter().filter(newText.toString());  
      return true;
 }

 @Override
 public boolean onQueryTextSubmit(String query) {
  // TODO Auto-generated method stub
  return false;
 }

@Override
public void onItemClick(AdapterView<?> parent, View view, int position,long id) {
    // TODO Auto-generated method stub
    view.setBackgroundColor(Color.CYAN);
}}

我的适配器是:

public class GroupAdapter extends ArrayAdapter<GroupsModel> implements Filterable{
    private Context activity;
    private ArrayList<GroupsModel> items ;
    private List<GroupsModel> arrayList;
    private ArrayFilter mFilter;
    private int resource;

    public GroupAdapter(Activity act, int resource, ArrayList<GroupsModel> arrayList) {
            super(act, resource, arrayList);
            this.activity = act;
            this.resource = resource;
            this.items = new ArrayList<GroupsModel>();
            this.items.addAll(arrayList);
            this.arrayList = new ArrayList<GroupsModel>();
            this.arrayList.addAll(arrayList);
    }

     public View getView(final int position, View convertView,final ViewGroup parent) {
                final ViewHolder holder;
                LayoutInflater inflater = ((Activity) activity).getLayoutInflater();
                if (convertView == null) {
                    convertView = inflater.inflate(resource,parent, false);
                    holder = new ViewHolder();
                    holder.group_name = (TextView) convertView.findViewById(R.id.group_name);
                    holder.select = (TextView) convertView.findViewById(R.id.select);
                    convertView.setTag(holder);
                } else {
                    holder = (ViewHolder) convertView.getTag();
                }
                try{
                    GroupsModel groups = items.get(position);

                    holder.group_name.setText(groups.getGroupName());
                }catch(Exception e){
                    e.printStackTrace();
                }
                holder.select.setOnClickListener(new View.OnClickListener() {
                    public void onClick(View arg0) {
                        // TODO Auto-generated method stub
                        holder.select.setText("my new text");
                    }
                });
                return convertView;
            }

    public class ViewHolder {
            public TextView group_name,select;
    }

    @Override
    public int getCount() {
        // Total count includes list items and ads.
        return items.size();
    }

    @Override
    public GroupsModel getItem(int position)
    {
        // TODO Auto-generated method stub
        return items.get(position);
    }
    @Override
    public long getItemId(int position)
    {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
public Filter getFilter() {
    if (mFilter == null) {
        mFilter = new ArrayFilter();
    }
    return mFilter;
}

private class ArrayFilter extends Filter {
    @Override
    protected FilterResults performFiltering(CharSequence prefix) {
        FilterResults results = new FilterResults();
        if (arrayList == null) {
            synchronized (this) {
                arrayList = new ArrayList<GroupsModel>(items);
            }
        }
        if (prefix == null || prefix.length() == 0) {
            ArrayList<GroupsModel> list;
            synchronized (this) {
                list = new ArrayList<GroupsModel>(arrayList);
            }
            results.values = list;
            results.count = list.size();
        } else {
            String prefixString = prefix.toString().toLowerCase();

            ArrayList<GroupsModel> values;
            synchronized (this) {
                values = new ArrayList<GroupsModel>(arrayList);
            }

            final int count = values.size();
            final ArrayList<GroupsModel> newValues = new ArrayList<GroupsModel>();
            for (int i = 0; i < count; i++) {
                final String value = values.get(i).getGroupName();
                final String valueText = value.toLowerCase();
                // First match against the whole, non-splitted value
                if (valueText.startsWith(prefixString)) {
                    newValues.add(values.get(i));
                } else {
                    final String[] words = valueText.split(" ");
                    final int wordCount = words.length;
                    // Start at index 0, in case valueText starts with space(s)
                    for (int k = 0; k < wordCount; k++) {
                        if (words[k].startsWith(prefixString)) {
                            newValues.add(values.get(i));
                            break;
                        }
                    }
                }
            }
            results.values = newValues;
            results.count = newValues.size();
        }
        return results;
    }

    @SuppressWarnings("unchecked")
            @Override
    protected void publishResults(CharSequence constraint, FilterResults results) {
       items = (ArrayList<GroupsModel>) results.values;
       if (results.count > 0) {
            notifyDataSetChanged();
        } else {
            notifyDataSetInvalidated();
        }
    }
}}

我无法弄清楚这一点。请帮忙

5 个答案:

答案 0 :(得分:1)

您需要在适配器中维护所选项目并使用它来更改文本:

适配器代码

 private int selectedIndex;
    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        final ViewHolder holder;
                    LayoutInflater inflater = ((Activity) activity).getLayoutInflater();
                    if (convertView == null) {
                        convertView = inflater.inflate(resource,parent, false);
                        holder = new ViewHolder();
                        holder.group_name = (TextView) convertView.findViewById(R.id.group_name);
                        holder.select = (TextView) convertView.findViewById(R.id.select);
                        convertView.setTag(holder);
                    } else {
                        holder = (ViewHolder) convertView.getTag();
                    }
        if(selectedIndex!= -1 && position == selectedIndex)
        {
            convert_view.setBackgroundColor(Color.CYAN);
           holder.select.setText("selected");

        }
        else
        {
            convert_vie.wsetBackgroundColor(default_color);
           holder.select.setText("Select");
        }
                //Your other code      .....

        return convertView ;
    }

   public void setSelectedIndex(position)
   {
       selectedIndex = position;
   }

现在,在单击列表项时设置selectedIndex变量。

public class MainActivity extends Activity implements OnItemClickListener
{
    // Implemented onItemClickListener

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id)
    {
        adapter.setSelectedIndex(position);
    }
}

答案 1 :(得分:1)

您可以添加会员&#34;已选中&#34;在GroupsModel中,初始它分配false;

活动

@Override
public void onItemClick(AdapterView<?> parent, View view, int position,long id) {
  final boolean isChecked = listView.getItem(position).isChecked();
  listView.get(position).setChecked(!isChecked);
}

在适配器中的getView()中:

public View getView(...) {
    ...
    if(getItem(position).isChecked()) {
        // You must set root view in holder
        holder.getBackground().setBackgroundColor(Color.CYAN);
    }
    ...
}

答案 2 :(得分:0)

您的问题是Android正在重复使用您的观看次数,因此当您滚动时,第一个视图会消失,并以相同的状态显示在底部。

你需要做的是每次检查一个项目时,你需要存储所检查项目的de id / position(可能是ArrayList<Integer>),这样每次你的getView方法被称为你时将查看您创建的此类/结构,并查看是否需要检查行。

注意:如果未选中该行,则必须调用myCheck->setChecked(false);以确保该行处于连贯状态。

答案 3 :(得分:0)

您必须使用数组或选项对象来记录选择的位置。

并在适配器中的getView()中检测数组或选项对象。

因此,您需要将代码:“view.setBackgroundColor(Color.CYAN)”移动到getView()方法。

答案 4 :(得分:0)

你被他们所说的“回收”问题所困扰 重新使用您的观点时,就会出现这种问题 有几种方法(例如在arraylist中保存已检查的位置,......)来处理它,但在我看来,最简单直接的解决方案是使用标签。 setTag()getTag() 这是使用它的tutorial 希望它有所帮助。