java - 与自定义 ListView 中特定项目的视图交互
问题描述
我正在使用自定义 BaseAdapter 创建自定义列表。我想做的是在 getView() 之外有一个公共函数,在这个例子中是setName(),它可以与列表中特定项目的视图交互。
例如调用 setName(1); 应该使列表中第二项的 TextView 不可见。
先感谢您。
public class ListAdapterNew extends BaseAdapter {
private int size;
private Context context;
private ViewHolder viewHolder;
String[][] data;
ArrayList<DataModel> listArray;
public ListAdapterNew(Context context, String[][] data, int size) {
listArray = new ArrayList<DataModel>(size);
for(int i=0;i<size;i++){
listArray.add(new DataModel(i));
}
this.context=context;
this.data=data;
this.size=size;
}
@Override
public int getCount() {
return listArray.size();
}
@Override
public Object getItem(int i) {
return listArray.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
public int getViewTypeCount() { return getCount(); }
@Override
public int getItemViewType(int position) {
return position;
}
private static class ViewHolder
{
TextView number,name;
}
@Override
public View getView(int index, View view, final ViewGroup parent) {
if (view == null) {
LayoutInflater li = (LayoutInflater) parent.getContext().getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
view = li.inflate(R.layout.main_user_list_item, parent, false);
viewHolder = new ViewHolder();
viewHolder.number = view.findViewById(R.id.main_list_number);
viewHolder.name = view.findViewById(R.id.main_list_name);
view.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) view.getTag();
viewHolder.number.setText((index+1)+")");
viewHolder.name.setText(data[index][0]);
}
view.setClickable(true);
view.setFocusable(true);
return view;
}
public void setName(int index){
viewHolder.name.setVisibility(View.GONE);
}
}
解决方案
答案很简单。我在 ListAdapterNew 中使用公共函数来更新 data[][] 并调用 notifyDataSetChanged(); 在适配器上。
适配器的 getView() 也有一个小的变化,它允许在项目变得可见时更新视图,如下所示。
if (view == null) {
LayoutInflater li = (LayoutInflater) parent.getContext().getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
view = li.inflate(R.layout.main_user_list_item, parent, false);
viewHolder = new ViewHolder();
viewHolder.number = view.findViewById(R.id.main_list_number);
viewHolder.name = view.findViewById(R.id.main_list_name);
view.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) view.getTag();
}
if (view != null){
viewHolder.number.setText((index+1)+")");
viewHolder.name.setText(data[index][0]);
}
更新数据的函数
public void updateIcons(int index, int data){
this.icons[index]=data;
}
推荐阅读
- amazon-web-services - 在 AWS lex Lambda 函数中获取 Slack userId
- javascript - 如何在 BootstrapVue 中立即显示新打开的选项卡内容?
- jupyter-notebook - 我在 jupyter notebook 中没有笔记本名称和工具栏,为什么?
- j - 如何在 J 中使用命令行参数
- python - 在 FuzzyWuzzy 中传递多个参数
- arduino - 如何区分一按和按住键?
- odbc - 使用 ODBC 查询获取 Netsuite Invoice 所有类型的行项目
- python-3.x - sqlalchemy 中的外键设置
- javascript - 我如何在反应中收听发布到 webhook 的数据?
- reactjs - 如何清除自动完成值