【问题标题】:Issue when changing the text of textview inside listview更改列表视图中的文本视图文本时的问题
【发布时间】:2014-01-14 18:23:26
【问题描述】:

我是这个 android 开发的新手,在 listview 中设置 textview 的文本时遇到问题。

问题:

活动 1 中的列表视图

=====================
型号
=====================
颜色
=====================
风格
=====================
制作
=====================

当我单击列表视图中的“模型”视图时。下面出现了

活动 2 中的列表视图

=====================
丰田
=====================
捷豹
=====================
本田
=====================

=====================

活动 1 中的结果

=====================
型号
=====================
颜色 -------------- 丰田
=====================
风格
=====================
制作
=====================

我在寻找什么:

=====================
型号 -------------- 丰田
=====================
颜色
=====================
风格
=====================
制作
=====================

这里是初始活动。当我单击列表视图中的“模型”时,另一个活动将显示汽车模型列表。 (使用 startactivtiyforresult() 调用新活动)

在第二个活动中,当我单击任何模型名称时,它会关闭当前活动并将所选模型名称传递给第一个活动。此模型名称设置为 OnActivityResult 方法中的 textview

我的自定义适配器

class CustomAdapter extends ArrayAdapter<String> {

    Context context;
    String[] titles;


    public CustomAdapter(Context context, String[] titles) {
        super(context, R.layout.dashboard_row_layout, R.id.row_textview, titles);

        this.context = context;
        this.titles = titles;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent){

        View row = convertView;
        ViewHolder holder;
        if(row==null)
        {
            LayoutInflater inflater = (LayoutInflater)context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
            row = inflater.inflate(R.layout.dashboard_row_layout, parent, false);
            holder = new ViewHolder(row);
            row.setTag(holder);
        }
        //((TextView)row.findViewById(R.id.row_textview)).setText(titles[position]);
        else
        {
            holder = (ViewHolder)row.getTag();
        }
        holder.textview.setText(titles[position].toString());

        return row;
    }
}

class ViewHolder
{
    TextView textview;
    ViewHolder(View v)
    {
        textview = (TextView) v.findViewById(R.id.row_textview);
    }
}

OnActivityResultMethod

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (resultCode)
            {
                case Activity.RESULT_OK:
                    //selectedModel = data.getStringExtra("response");
                      setDateTextView.setText(data.getStringExtra("response"));
            }
    }

片段的OnCreateView

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        final View rootView = inflater.inflate(R.layout.fragment_vehicle_information, container, false);

        SeparatedListAdapter adapter = new SeparatedListAdapter(this.getActivity());
        adapter.addSection("Plate Information", new CustomAdapter(this.getActivity(),getResources().getStringArray(R.array.plateInformationArrayList)));
        adapter.addSection("Vehicle Information", new CustomAdapter(this.getActivity(),getResources().getStringArray(R.array.vehicleInformationArrayList)));
        ((ListView)rootView.findViewById(R.id.veh_information_listView)).setAdapter(adapter);

        //Click Listener for listview with custom view
        ((ListView)rootView.findViewById(R.id.veh_information_listView)).setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                if(((TextView)view.findViewById(R.id.row_textview)).getText().toString().equalsIgnoreCase("Expiration")){
                    DateDialog dialog = new DateDialog(getActivity(), (TextView)view.findViewById(R.id.statename_textView));
                    dialog.returnDateDialog().show();
                }
                else if(((TextView)view.findViewById(R.id.row_textview)).getText().toString().equalsIgnoreCase("Model")){
                    setDateTextView = (TextView)view.findViewById(R.id.statename_textView);
                    startActivityForResult(new Intent(getActivity(), VehicleInformationDetails.class),  1);
                }

            }
        });


        return rootView;
    }

第二个活动

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View rootView = inflater.inflate(R.layout.fragment_searchable_listview, container, false);
    ListView listview = (ListView)rootView.findViewById(R.id.searchable_listView);
    MyAdapter adapter = new MyAdapter(context, array);
    listview.setAdapter(adapter);
    listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            TextView textView = (TextView)view.findViewById(R.id.list_item_title);
            Intent returnIntent = new Intent();
            returnIntent.putExtra("response", textView.getText().toString());
            getActivity().setResult(Activity.RESULT_OK, returnIntent);
            getActivity().finish();
        }
    });
    SetActionBarTitle(this.actionBarTitle);

    return rootView;

}

希望这个解释是有帮助的。请帮帮我。

【问题讨论】:

  • 由于stackoverflow信誉无法添加图片。

标签: android android-listview android-fragments android-activity


【解决方案1】:

尝试从适配器外部直接更改列表项内的文本视图的文本是不可靠的。一方面,视图不会匹配适配器的支持数据。此外,您的适配器不会尝试清除辅助文本视图的任何现有内容,因此当您的列表视图回收其视图时,您将遇到很多像这样的异常问题。

所以删除所有引用setDateTextView 的行。相反,您需要一个自定义类来表示列表项的所有可能数据,如下所示:

public class MyListItem {
    public String title;
    public String state;

    public MyListItem(String title){
        this(title, "");
    }

    public MyListItem(String title, String state){
        this.title = title;
        this.state = state;
    }
}

然后将其用作自定义适配器的对象类型:

class CustomAdapter extends ArrayAdapter<MyListItem> {

    public CustomAdapter(Context context, MyListItem[] listItems) {
        super(context, R.layout.dashboard_row_layout, listItems);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent){

        View row = convertView;
        ViewHolder holder;
        if(row==null)
        {
            LayoutInflater inflater = (LayoutInflater)getContext().getSystemService(context.LAYOUT_INFLATER_SERVICE);
            row = inflater.inflate(R.layout.dashboard_row_layout, parent, false);
            holder = new ViewHolder(row);
            row.setTag(holder);
        }
        else
        {
            holder = (ViewHolder)row.getTag();
        }

        holder.titleTextview.setText(getItem(position).title);
        holder.stateTextview.setText(getItem(position).state);

        return row;
    }
}

class ViewHolder
{
    TextView titleTextview;
    TextView stateTextview;
    ViewHolder(View v)
    {
        titleTextview= (TextView) v.findViewById(R.id.row_textview);
        stateTextview= (TextView) v.findViewById(R.id.statename_textView);
    }
}

最后,在您的onActivityResult() 中,告诉适配器更改相应行的内容数组的值。您必须将这些变量设置为成员变量,但请执行以下操作:

switch (resultCode)
{
    case Activity.RESULT_OK:
        mListAdapter.getItem(mModelItemPosition).state = data.getStringExtra("response");
        mListAdapter.notifyDataSetChanged();
        break;
}

【讨论】:

  • 谢谢,这很有帮助。但是还有一件事为什么我们需要使适配器失效?
  • 对不起,我认为正确的方法名称是notifyDataSetChanged()(不是invalidate())。我是凭记忆做的,所以无法检查。需要告知列表适配器您刚刚更改了基础数据,以便它告诉 ListView 刷新其视图。
猜你喜欢
  • 1970-01-01
  • 2012-11-26
  • 2015-10-23
  • 1970-01-01
  • 2013-06-04
  • 2016-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多