TextView .setText在OnClick方法上不起作用

时间:2019-09-16 19:09:27

标签: android

我有一个ListView驻留在一个片段中。列表项包含多个布局,每个布局中都有Textview。 我使用的是一个AlertDialog,它应要求用户编写某些内容,然后当用户单击“是”按钮时,代码将用用户编写的内容更改TextView的值。 因此,当用户单击列表视图中的某个项目时,会出现一个AlertDialog,要求用户编写一些内容,并更改该项目的TextView文本。

在我的测试代码中,我尝试了一个更简单的版本:出现alertdialog,用户只需要单击yes按钮,然后alertdialog在文本视图中放置“ test”。 下面的代码:

  final View rootView =inflater.inflate(R.layout.fragment_notes, container, false);

            List<ItemListViewModel1> list = listfiller();

            ListView testListView = rootView.findViewById(R.id.idListViewNotes);
            testListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                      LayoutInflater inflater = requireActivity().getLayoutInflater();
                      final View edittext_View = inflater.inflate(R.layout.edittext_changement_note,null);

                      AlertDialog.Builder builder = new AlertDialog.Builder(getContext());

                      builder.setTitle(nomNote);
                      builder.setView(edittext_View);
                      builder.setPositiveButton("Valider", new DialogInterface.OnClickListener() {
                          @Override
                          public void onClick(DialogInterface dialog, int which) {
                               ((TextView) view.findViewById(R.id.idTextViewNote)).setText("test");
                               }
                          }
                      });

                      AlertDialog alertDialog = builder.create();
                      alertDialog.show();

                }
            });
            testListView.setAdapter(new ItemListViewAdapter(getContext(),list));

问题在于

((TextView) view.findViewById(R.id.idTextViewNote)).setText("test");

仅当放在setPositiveButton的Onclick之外时才起作用。 当此行位于Onclick内时,Textview保留其先前的测试。

我的问题是如何使它在OnClick中设置文本?

此外,我的listfiller()是填充列表的函数,但不属于问题的一部分。

编辑:根据要求,这是我的ItemListViewAdapter代码:

public class ItemListViewAdapter extends BaseAdapter {

    //fields
    private Context context;
    private List<ItemListViewModel1> listeItems;
    private LayoutInflater inflater;

    //constructor
    public ItemListViewAdapter(Context context, List<ItemListViewModel1> listeItems){
        this.context = context;
        this.listeItems = listeItems;
        this.inflater = LayoutInflater.from(context);
    }


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

    @Override
    public ItemListViewModel1 getItem(int position) {
        return listeItems.get(position);
    }

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

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

        convertView = inflater.inflate(R.layout.layout_note, null);

        //Récupère les infos de l'item pour changer le texte des Textview etc
        ItemListViewModel1 currentItem = getItem(position);
        //On récupère les fameuses infos
        String title = currentItem.getTitle();
        String subtitle = currentItem.getSubtitle();
        String nombre = currentItem.getNombre();

        //On crée les éléments pour en changer les valeurs
        TextView titleTextView = convertView.findViewById(R.id.idTextViewNomNote);
        titleTextView.setText(title);
        TextView subtitleTextView = convertView.findViewById(R.id.idTextViewPole);
        subtitleTextView.setText(subtitle);
        TextView noteTextView = convertView.findViewById(R.id.idTextViewNote);
        noteTextView.setText(nombre);


        return convertView;
    }
}

ItemListViewModel1只是一个包含3个字符串及其get方法的对象

1 个答案:

答案 0 :(得分:0)

当您尝试在肯定按钮的onclick侦听器中访问视图对象时,您可能应该会得到编译错误。因为它没有声明为final。让我向您展示如何通过一些补丁使现有代码正常工作,

    testListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                  final TextView tv = view.findViewById(R.id.idTextViewNote);
                  ...
                  builder.setPositiveButton("Valider", new DialogInterface.OnClickListener() {
                      @Override
                      public void onClick(DialogInterface dialog, int which) {
                           tv.setText("test");
                      }
                  });

                  builder.show();

            }
    });

推荐的解决方案

以上解决方案仅使您现有的代码正常工作,但随着数据大小的增长而不会持久。因此,更好的方法是更改​​数据集并通知适配器。这是示例代码

testListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
              final ItemListViewModel1 item = (ItemListViewModel1) adapterView.getItemAtPosition(position);;
              final BaseAdapter adapter = (BaseAdapter) adapterView.getAdapter();
              ...
              builder.setPositiveButton("Valider", new DialogInterface.OnClickListener() {
                  @Override
                  public void onClick(DialogInterface dialog, int which) {
                       item.setNombre("test");
                       adapter.notifyDataSetChanged();
                  }
              });

              builder.show();

        }
});