在另一个活动的列表视图的编辑文本中获取另一个活动的价值

Posted

技术标签:

【中文标题】在另一个活动的列表视图的编辑文本中获取另一个活动的价值【英文标题】:Get value on another activity put in Edit text of list view of another activity 【发布时间】:2020-03-11 12:56:05 【问题描述】:

MainActivitymp3 中有带有 Edittext 的列表视图。我希望当我长按每个编辑文本时,会显示新的 MainActivitysentencerecording 然后单击关闭按钮后,此(5)上的值将放入 MainActivitymp3。 这是 MainActivitymp3 活动的 MycustomerAdater 类

public class MyCustomAdapter extends BaseAdapter 
HashMap<String, String> newupdatelist = new HashMap<String, String>();
public Context context;

public static ArrayList<Song> listsong;
private DatabaseSQL datab;
private final String TAG = getClass().getSimpleName();

public MyCustomAdapter(Context context, ArrayList<Song> objects) 
    this.context=context;
    this.listsong=objects;

...
 public View getView(final int position, View convertView, ViewGroup parent) 
    final ViewHolder viewHolder;
    if(convertView==null)
        convertView = LayoutInflater.from(context).inflate(R.layout.song_items,parent,false);
        viewHolder = new ViewHolder();
        viewHolder.tenbai = (TextView) convertView.findViewById( R.id.text);
        viewHolder.delaytime = (EditText) convertView.findViewById(R.id.delay);
        viewHolder.timeunit = (TextView) convertView.findViewById(R.id.timeunit);
        convertView.setTag(viewHolder);
    
    else 
        viewHolder = (ViewHolder) convertView.getTag();
    
    Song infor = listsong.get(position);
    viewHolder.tenbai.setText(infor.getTenbai());
    viewHolder.timeunit.setText(infor.getTimeunit());
    viewHolder.delaytime.setText(infor.getDelaytime());


    convertView.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 

            if (context instanceof MainActivitymp3) 
                //play selection song
 ((MainActivitymp3)context).playMedia(listsong.get(position).getDuongdan().toString());
            

        
    );
    viewHolder.delaytime.addTextChangedListener(new TextWatcher() 

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) 
  // update new value from edittext to listsong array
         listsong.get(position).setDelaytime(viewHolder.delaytime.getText().toString() );
         
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) 
        
        @Override
        public void afterTextChanged(Editable s) 

        
    );
    viewHolder.delaytime.setOnLongClickListener(new View.OnLongClickListener() 
        @Override
        public boolean onLongClick(View v) 
            // TODO Auto-generated method stub
            Toast.makeText(context, "vi tri"+ position, Toast.LENGTH_LONG).show();
            Intent intend = new Intent(context, MainActivitysentencerecording.class);
            Activity origin = (Activity)context;
            origin.startActivityForResult(intend, 200);
       // Deleted these below lines as @David Wasser answered
          //int x=  ((MainActivitymp3)context).gio;
           // viewHolder.delaytime.setText(String.valueOf( x ));

            return true;
    );      
    return convertView;
   

public class ViewHolder
    TextView tenbai;
    EditText delaytime;
    TextView timeunit;
 
 

这是 MainActivitymp3 类

public class MainActivitymp3 extends AppCompatActivity 
  ...
 public  int gio;
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) 
    ( new MyCustomAdapter( this, fileNames )).onActivityResult(requestCode, resultCode, data);
    if(resultCode == Activity.RESULT_OK)
        if(requestCode == 200)
            // here comes the data from activity
            gio = data.getIntExtra("timedelaysetting",0);
            Log.d("MyAdapter", "onActivityResult  "+gio);

        
    

这里是 MainActivitysentencerecording 活动

public class MainActivitysentencerecording extends AppCompatActivity 
 ...
//close button click
 Intent resultIntent = new Intent();
            resultIntent.putExtra("timedelaysetting", sec);
            setResult( Activity.RESULT_OK, resultIntent);
            finish();

请帮忙解决这个问题。我正在寻找您的来信。谢谢

【问题讨论】:

您还可以传递包含在适配器中的长按编辑文本的行索引,然后用于查找行 对不起!你能输入一些带有代码的单词来回答吗?我不明白你的意思 使用事件总线库将数据从应用程序的任何地方传递到任何地方。! greenrobot.org/eventbus @onur taskin。它对我有用。我得到行的值和索引,然后更新 MyCustomAdapter 的数组列表。之后 Listview 设置为新的 MyCustomAdapter 。谢谢您的建议。 :) 【参考方案1】:

您似乎不明白如何从另一个启动Activity。在您的 longclick 侦听器中,您有以下代码:

origin.startActivityForResult(intend, 200);
int x=  ((MainActivitymp3)context).gio;
viewHolder.delaytime.setText(String.valueOf( x ));

这意味着您认为,当您调用 startActivityForResult() 时,控制权会立即传递给 MainActivitysentencerecording,并且下一行代码 (int x= ((MainActivitymp3)context).gio;) 仅在 MainActivitysentencerecording 完成并完成后执行。

这不是它的工作原理。当您调用startActivityForResult() 时,您只是要求android 框架在Android 框架重新获得控制权时启动目标Activity(在本例中为MainActivitysentencerecording。接下来的几行代码在调用startActivityForResult() 之后立即执行,然后MainActivitysentencerecording 甚至被启动并显示给用户。

您只需在调用startActivityForResult() 后只需return,Android 框架就会重新获得控制权并启动MainActivitysentencerecording。当Activity 完成时,Android 框架将调用MainActivitymp3.onActivityResult()。这是异步发生的,而且比你想象的要晚得多。您只能在调用onActivityResult() 之后更新您的 UI。

【讨论】:

Waseer 谢谢你的课。你说的对 。我停止使用 int x= ((MainActivitymp3)context).gio; viewHolder.delaytime.setText(String.valueOf(x));如你所说。但是我不明白你提到的方法 MainActivitymp3.onActivityResult() 。你能帮我更多更详细的吗?非常感谢您的帮助 请在网上搜索有关如何使用startActivityForResult() 的教程。我无法在答案中向您解释,这不是 *** 的用途。

以上是关于在另一个活动的列表视图的编辑文本中获取另一个活动的价值的主要内容,如果未能解决你的问题,请参考以下文章

在另一个活动中创建的对象在主活动中不可见

如何在列表视图的每个项目上加载 json 数据并显示在 android 的另一个活动中获取的数据?

如何将一个自定义列表的选定数据显示到同一活动的另一个自定义列表视图

如何从另一个活动中编辑和获取 editText 输入字段的更新?

当我单击列表视图的操作项时,将文本从列表视图传递到另一个活动

如何从回收站视图 android 中传递一个 url onclick 项目并 onclick 获取位置 dipaly 在另一个活动中的 url