在自定义适配器类中发送服务器请求后,如何更改 Listview 按钮名称?

Posted

技术标签:

【中文标题】在自定义适配器类中发送服务器请求后,如何更改 Listview 按钮名称?【英文标题】:How to Change Listview Button name After sending a server request inside a custom adapter class? 【发布时间】:2015-08-12 10:11:12 【问题描述】:

最近我正在开发一个基于在线的学生教师交流应用程序。在这个应用程序中,有一部分学生必须向老师发送请求以添加到他的班级中。

这是自定义适配器 getView 代码,我使用 listview custiom 按钮在其中发送请求。我想将异步任务代码放在这个适配器类中。但我不能这样做。在 listview onclick 按钮方法内部无法识别 asynctask 方法。所以我将 asynctask 方法放在另一个类中。我想在这个适配器类中放置 asyntask 方法,因为我想在 onPostExecute 中发送请求后将按钮名称 "Request" 更改为 "Sent" b> 方法。我手动更改了按钮名称,但我想确保用户的请求是 100% 发送的。所以请告诉我我必须将 asynctask 方法放在这个适配器类中的什么位置,以便我可以更改按钮名称。百万提前致谢。

package project.cc.student;
import java.util.ArrayList;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import com.example.connectifyclas-s-room.R;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class SubjectAdapter extends ArrayAdapter<Subject> 
    ArrayList<Subject> contactList;
    LayoutInflater vi;
    int Resource;
    ViewHolder holder;
    int studentID;
    SendRequest sendRequest;
    String requestUrl;
    ArrayList<NameValuePair> params;
    public SubjectAdapter(Context context, int resource, ArrayList<Subject> objects,int studentID) 
        super(context, resource, objects);
        vi = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        Resource = resource;
        contactList = objects;
        this.studentID = studentID;
        Log.d("bug", "studentID" + studentID);
        params = new ArrayList<NameValuePair>();

    
        @Override
        public View getView( final int position, View convertView, ViewGroup parent) 
            // convert view = design
            View v = convertView;
            if (v == null) 
                holder = new ViewHolder();
                v = vi.inflate(Resource, null);
                holder.tvSubject = (TextView) v.findViewById(R.id.tvSujectName);
                holder.tvTeacher = (TextView) v.findViewById(R.id.tvTeacherName);
                holder.btSendRequest =  (Button) v.findViewById(R.id.bt_send_subject_request);
                holder.btSendRequest.setOnClickListener(new Button.OnClickListener() 

                    @Override
                    public void onClick(View view) 
                        // TODO Auto-generated method stub

                        Integer pos = (Integer)view.getTag();
                        Button b = (Button) view;
                        sendRequest = new SendRequest();
                        Toast.makeText(getContext(),"Please Wait...", Toast.LENGTH_SHORT).show();

                        params.add(new BasicNameValuePair("studentID", Integer.toString(studentID)));
                        params.add(new BasicNameValuePair("teacherID", Integer.toString(contactList.get(pos).getTeacherUid())));
                        params.add(new BasicNameValuePair("subjectID", Integer.toString(contactList.get(pos).getSubjectUid())));
                        sendRequest.setPair(params);
                        sendRequest.startRequest();
                        Toast.makeText(getContext(),"Request Sent", Toast.LENGTH_SHORT).show();
                        b.setText("Sent");



                    
                );
                v.setTag(holder);
             else 
                holder = (ViewHolder) v.getTag();
            

        holder.tvSubject.setText(contactList.get(position).getSubject());
        holder.tvTeacher.setText(contactList.get(position).getTeacher());
        holder.btSendRequest.setTag(position);

        return v;

    

    static class ViewHolder 
        public TextView tvSubject;
        public TextView tvTeacher;
        public Button btSendRequest;

    

【问题讨论】:

【参考方案1】:

我认为你是 android 的新手。这不是一个好的解决方案,但它会帮助你。在请求按钮之后,在您的适配器类中设置一个线程 3 秒,并在您的项目中创建一个名为 isSend() 的标志。更改发送 asynctask onpost() 方法中的标志。而不是检查线程中的标志。希望对你有帮助。

【讨论】:

【参考方案2】:

我会建议你通过回调来解决这个问题。

为此,请创建一个包含 onRequestSended 方法的接口(例如 RequestStatusCallback)。

    现在让 SubjectAdapter 实现这个接口。 -> onRequestSended() 改变按钮的外观。

    在 SendRequest 中创建一个 ctor,它需要一个 RequestStatusCallback 实例。将其保存为实例变量。

    如果SendRequest发送请求成功,调用回调的onRequestSended方法。

所以,只有当请求被发送时,按钮才会被更新。 现在您可以添加更多回调,例如“onRequestFailed()”等等...

【讨论】:

2 号的 ctor 是什么? 自定义构造函数 -> SendRequest(RequestStatusCallback callback) this.callback = callback; 【参考方案3】:

对Web服务的响应项clickListener比使用简单的使用这些

holder.btSendRequest.setText("Sent")

【讨论】:

【参考方案4】:

将另一个属性添加到contactListbuttonText

buttonText 的默认文本为“Request”,点击后将其更改为“send”并调用 notifyDataSet();

【讨论】:

服务器请求失败怎么办?

以上是关于在自定义适配器类中发送服务器请求后,如何更改 Listview 按钮名称?的主要内容,如果未能解决你的问题,请参考以下文章

EditText.SetText() 在自定义适配器中更改我的软键盘输入类型

我在自定义表格视图中有 FB 朋友的图像和名称。如何获取 FB ID 中的选定行并将请求发送给多个朋友?

在自定义类中访问 Blazor 服务器端的 AuthenticationStateProvider

在自定义适配器的列表视图项中加载不同的图像

如何在自定义适配器中搜索?

如何在自定义适配器上实现 onClickListener?