Android Java:无法通过onScroll侦听器有选择地突出显示ListView中的行

时间:2014-12-31 19:34:30

标签: android listview android-listview

在研究Android开发时,我有另一个拦截器。 这次我的问题是当我想要选择性地"突出显示由适配器中的数据填充的ListView中的行。

此ListView实际上位于一个对话框中,目的是显示一个朋友列表,用户可以在其中选择多个选择并突出显示它。 顺便说一下,所选择的值存储在ArrayList" arr_FriendsShare"这样,下次打开列表视图时,行将突出显示(通过onScrollListener),用于之前选择的行。

目前正在发生什么,只有"最近"或者"最后"点击的行/项目突出显示;并且似乎正在清除所有先前突出显示的行。

我无法理解为什么它会以这种方式表现,因为当我点击它时,行的值已成功存储到arr_FriendsShare ArrayList中/从中删除。

以下是我的听众代码,并提前感谢通常的帮助:

    //Item click listener for Select Friends ListView
    listview_SelectFriends.setOnItemClickListener(new OnItemClickListener()
    {
       @Override
       public void onItemClick(AdapterView<?> adapter, View v, int position,
             long arg3) 
       {
             String friends_ListItemSelected = (String)adapter.getItemAtPosition(position); 

             if(!arr_FriendsShare.contains(friends_ListItemSelected)){
                 arr_FriendsShare.add(friends_ListItemSelected);
             }
             else{
                 removeItemFromArrayListString(Main.this, arr_FriendsShare, friends_ListItemSelected);
             }
       }
    });

    listview_SelectFriends.setOnScrollListener(new OnScrollListener() {
        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {

        }

        @Override
        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 
            for (int i = firstVisibleItem; i < (visibleItemCount + firstVisibleItem); i++) {
                String listViewItemText = view.getItemAtPosition(i).toString();
                if(arr_FriendsShare.contains(listViewItemText)){
                    ColorDrawable cd = new ColorDrawable(getResources().getColor(R.color.red_light));
                    view.setSelector(cd);
                }
                else if(arr_FriendsShare.contains(listViewItemText)){
                    ColorDrawable cd = new ColorDrawable(Color.TRANSPARENT);
                    view.setSelector(cd);
                }
            }
        }
    });

附加代码块

    ArrayList<String> stringArray = new ArrayList<String>();
    String jsonURL = <SOME URL HERE>;
    stringArray = Global.getStringArrayFromJSON(Main.this, jsonURL, "friends", "FriendUsername");

    LayoutInflater inflater = getLayoutInflater();
    View convertView = (View) inflater.inflate(R.layout.friends_list_layout, null);

    ListView listview_SelectFriends = (ListView) convertView.findViewById(R.id.layout_Friends);
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, stringArray);
    listview_SelectFriends.setAdapter(adapter);

1 个答案:

答案 0 :(得分:1)

更改

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, stringArray);

// Define this at class level as --> private FriendsAdapter adapter = null;
adapter = new FriendsAdapter(Main.this, stringArray);

在您的活动中添加此方法

private void setResetSelection(int index, boolean setSelection){
    View v = listview_SelectFriends.getChildAt(index);
    if(v != null){
        TextView name = (TextView) v.findViewById(R.id.name);
        if(setSelection)
            name.setBackgroundResource(R.color.red);
        else
            name.setBackgroundResource(R.color.transparent);
    }
}

并创建一个新类

public class FriendsAdapter extends BaseAdapter {
private LayoutInflater mInflater;
private ArrayList<String> mFriends;
private ArrayList<String> mSelectedFriends = new ArrayList<String>();

public GoodPeopleAdapter(Context context, ArrayList<String> friends) {
    mInflater = LayoutInflater.from(context);
    mFriends= friends;
}

public void setSelectedFriends(ArrayList<String> selectedFriends){
    mSelectedFriends = selectedFriends;
}

@Override
public int getCount() {
    return mFriends.size();
}

@Override
public Object getItem(int position) {
    return mFriends.get(position);
}

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

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View view;
    ViewHolder holder;
    if(convertView == null) {
        view = mInflater.inflate(R.layout.row_layout, parent, false);
        holder = new ViewHolder();
        holder.name = (TextView)view.findViewById(R.id.name);
        view.setTag(holder);
    } else {
        view = convertView;
        holder = (ViewHolder)view.getTag();
    }

    String name = mFriends.get(position);
    holder.name.setText(name);

    if(mSelectedFriends.contains(name))
        holder.name.setBackgroundResource(R.color.red) // red is in color xml by default, change according to your choice

    return view;
}

private class ViewHolder {
    public TextView name;
}
}

在方法onItemClick

的末尾添加以下行
adapter.setSelectedFriends(arr_FriendsShare);

onItemClick

的if部分添加此内容
setResetSelection(position, true);

和其他部分

setResetSelection(position, false);

同时创建一个名为row_layout的新xml布局,其文字视图的标识为name