Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/195.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android TextView.setText不';不要使用OnClick方法_Android - Fatal编程技术网

Android TextView.setText不';不要使用OnClick方法

Android TextView.setText不';不要使用OnClick方法,android,Android,我有一个ListView,它驻留在一个片段和中。列表项包含多个布局,每个布局中都有Textview。 我正在使用一个AlertDialog,它应该要求用户编写一些东西,然后当用户单击yes按钮时,代码会用用户编写的内容更改TextView的值。 因此,当用户单击listview的某个项目时,会出现一个AlertDialog,要求用户编写一些内容,并更改该项目的TextView文本 在我的测试代码中,我尝试了一个更简单的版本:出现alertdialog,用户只需单击yes按钮,然后alertdia

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

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

  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));
仅当置于
setPositiveButton
Onclick
之外时才起作用。 当此行位于
Onclick
内时,Textview将保留其先前的测试

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

另外,my 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;
    }
}
公共类ItemListViewAdapter扩展了BaseAdapter{
//田地
私人语境;
私人物品清单;
私人充气机;
//建造师
公共项ListViewAdapter(上下文上下文,列表项){
this.context=上下文;
this.listeItems=listeItems;
this.inflater=layoutiner.from(上下文);
}
@凌驾
public int getCount(){
返回listeItems.size();
}
@凌驾
公共项ListViewModel1获取项(int位置){
返回列表项。获取(位置);
}
@凌驾
公共长getItemId(int位置){
返回0;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
convertView=充气机。充气(R.layout.layout_注释,空);
//Récupère les infos de l'item pour changer le texte des Textview等
ItemListViewModel1 currentItem=getItem(位置);
//关于法国名人杯
String title=currentItem.getTitle();
字符串subtitle=currentItem.getSubtitle();
字符串nombre=currentItem.getNombre();
//关于《美丽的情人》杂志
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);
返回视图;
}
}

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

当您尝试在肯定按钮的onclick侦听器中访问view对象时,可能会出现编译错误。因为它不是最终的。让我向您展示如何使用一个小补丁使现有代码正常工作

    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(新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
最终文本视图tv=view.findViewById(R.id.idTextViewNote);
...
setPositiveButton(“Valider”,新的DialogInterface.OnClickListener(){
@凌驾
public void onClick(DialogInterface dialog,int which){
tv.setText(“测试”);
}
});
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();

        }
});
testListView.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
final ItemListViewModel1 item=(ItemListViewModel1)adapterView.getItemAtPosition(position);;
最终BaseAdapter=(BaseAdapter)adapterView.getAdapter();
...
setPositiveButton(“Valider”,新的DialogInterface.OnClickListener(){
@凌驾
public void onClick(DialogInterface dialog,int which){
项目.设置名称(“测试”);
adapter.notifyDataSetChanged();
}
});
builder.show();
}
});

要更改textview值,必须更改listview使用的基础数据存储,然后调用notifyDatasetChange()。你能发布你的ItemListViewAdapter代码吗?当然,我把它添加到了我的帖子中,寻找编辑。事实上,我没有成功地使用你的第一个解决方案,但是推荐的解决方案工作得很好
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();

        }
});