【问题标题】:Repeating text inside getview's textview在 getview 的 textview 中重复文本
【发布时间】:2014-05-15 19:35:59
【问题描述】:

我正在实现一个自定义 ListView,它有一些文本字段(用于标题),在单击该文本视图下方时,它会打开一个显示选项列表的警报对话框,当用户选择任何选项时,TextView 文本设置为该选项。到这里一切都很好,但是当我滚动列表视图时,在该文本视图中选择的值只是更改为其他一些值。请帮我解决这个问题如何使这个视图正确。为此,我在下面显示两张图片

第一张图片,我选择了第一行文本作为一个,另一行保持不变。

这是在向下滚动和回滚后显示的第二张图片,第一行 textview 刚刚更改,另一个也充满了文本,即使我没有为它们选择任何值。

这是我的 MainActivity 代码

public class MainActivity extends Activity{

    Controller control ; 
    ArrayList<MyDetails> detail;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.test_speed);

        detail=(ArrayList<MyDetails>) control.Table_Details.Data();


        ListView listview = (ListView) findViewById(R.id.list_layout);
        MyBaseAdapter adapter = new MyBaseAdapter(this, detail);
        listview.setAdapter(adapter);

    }

    public void showDialog(final TextView option,final CharSequence[] items){
       AlertDialog.Builder builder = new AlertDialog.Builder(getParent());
       builder.setTitle("Make your selection");
       builder.setItems(items, new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface dialog, int item) {
               // Do something with the selection
               option.setText(items[item]);
           }
       });
       AlertDialog alert = builder.create();
       alert.show();
    }
}

这是我的适配器代码

public class MyBaseAdapter extends BaseAdapter{


    ArrayList<MyDetails> list;
    Context context ;
    public MyBaseAdapter(Context con, ArrayList<MyDetails> detail) {
        this.context = con;
        this.list =detail ;
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return list.size();
    }

    @Override
    public Object getItem(int arg0) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public long getItemId(int arg0) {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public View getView(int position, View view, ViewGroup arg2) {
        // TODO Auto-generated method stub

        LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        if(view == null)
        {
            view = inflater.inflate(R.layout.adapter_layout, null);
        }

        TextView title= (TextView) view.findViewById(R.id.title);
        final TextView data = (TextView) view.findViewById(R.id.data);
        title.setText(list.get(position).title());

         final CharSequence[] items = {
                    "One", "tow", "three", "four", "six"
            };

        data.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                ((MainActivity) context).showDialog(data,items);
            }
        });

        return view;
    }

}

任何帮助将不胜感激。提前致谢。

【问题讨论】:

  • 而不是使用data.setOnClickListener,您应该实现OnItemClickListener 来区分您正在单击的项目并需要相应地进行更改。
  • @Tukajo 这是您发布的好信息,谢谢。你能帮我一些代码示例来解决上述问题吗?

标签: android android-listview


【解决方案1】:

每次您在Adapter 中调用getView() 时,都应该通过查找ID 的TextView 来解决您的问题。我可能是错的,但我认为您应该尝试在为布局的项目充气并(after)为其设置文本时获取视图。

此外,使用ViewHolder 可能会提高性能,它只允许调用findViewById 一次,避免在滚动列表时每次调用getView() 时调用它。
因此,尝试使用ViewHolder,如下所示:

public class MyBaseAdapter extends BaseAdapter {

    // init the viewholder 
    protected class ViewHolder() {
        TextView title, data;
    }  

    @Override
    public View getView(int position, View view, ViewGroup arg2) {
        // create the var viewholder
        ViewHolder holder;
        // init the row once if it's null
        if(view == null) {
            // inflate the row and find views only the first time
            LayoutInflater inflater = (LayoutInflater) 
                       context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = inflater.inflate(R.layout.adapter_layout, null);
            // create the viewholder
            holder = new ViewHolder();
            // attach views with viewholder
            holder.title = (TextView) view.findViewById(R.id.title);
            holder.data = (TextView) view.findViewById(R.id.data);
            // set a tag to retrieve it later
            view.setTag(holder);
        } else {
            // reuse the row by getting the previous tag
            holder = (ViewHolder) view.getTag();
        }
        // set the text to the views attached
        title.setText(list.get(position).title());
        ...
        return view;
    }
}   

另外,正如 Tukajo 在问题下方的 cmets 中所说,最好将 ItemClickListener 设置为整行而不是在其中设置 OnClickListener
因此,在活动中setAdapter()之后,调用Dialog

listview.setOnItemClickListener(new OnItemClickListener() {
    public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
        // Show the dialog...
        // (Not sure but you can try to retrieve the TextView like this:)   
        showDialog( ((TextView) v.findViewById(R.id.data)) , items);
        // Then 'items' array needs to be in the Activity, outside the Adapter
    }
}); 

希望这能解决您的问题。

【讨论】:

    猜你喜欢
    • 2015-07-12
    • 2012-02-29
    • 2016-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多