如何在自定义适配器 class 内发送服务器请求后更改 Listview 按钮名称?
How to Change Listview Button name After sending a server request inside a custom adapter class?
最近我正在开发一个基于在线的师生交流应用程序。在此应用程序中,有一部分学生必须向老师发送请求以添加到他的class。
这是自定义适配器 getView 代码,我在其中使用 listview 自定义按钮发送请求。我想将异步任务代码放入此适配器 class.But 我做不到。 listview 内部的 onclick 按钮方法无法识别 asynctask 方法。所以我将 asynctask 方法放在另一个 class 中。我想在此适配器 class 中放置 asyntask 方法,因为我想将按钮名称 "Request" 更改为 "Sent" 在 onPostExecute 方法中发送请求后。我手动更改了按钮名称,但我想确保用户已 100% 发送该请求。所以请告诉我必须在此适配器 class 中放置 asynctask 方法的位置,以便我可以更改按钮名称。百万提前致谢。
package project.cc.student;
import java.util.ArrayList;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import com.example.connectifyclassroom.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;
}
}
添加另一个 属性 到 contactList
说 buttonText
buttonText 的默认文本将为 "Request",单击时将其更改为 "send" 并调用 notifyDataSet();
关于 Web 服务对项目 clickListener 的响应,只需使用这些
holder.btSendRequest.setText("Sent")
我建议你通过回调来解决这个问题。
为此,创建一个包含方法 onRequestSended 的接口(例如 RequestStatusCallback)。
现在让 SubjectAdapter 实现这个接口。
-> onRequestSended() 改变了按钮的外观。
在 SendRequest 中创建一个 ctor,它需要一个 RequestStatusCallback 实例。将其保存为实例变量。
如果SendRequest发送请求成功,调用回调的onRequestSended方法
因此,只有当请求已发送时,按钮才会更新。
现在您可以添加更多回调,例如 "onRequestFailed()" 等等...
我认为你是 android 的新人。这不是好的解决方案,但它会帮助你。在请求按钮之后,在您的适配器 class 中设置一个线程 3 秒,并在您的项目中创建一个名为 isSend() 的标志。更改发送异步任务 onpost() 方法中的标志。比检查线程中的标志。希望对你有帮助。
最近我正在开发一个基于在线的师生交流应用程序。在此应用程序中,有一部分学生必须向老师发送请求以添加到他的class。
这是自定义适配器 getView 代码,我在其中使用 listview 自定义按钮发送请求。我想将异步任务代码放入此适配器 class.But 我做不到。 listview 内部的 onclick 按钮方法无法识别 asynctask 方法。所以我将 asynctask 方法放在另一个 class 中。我想在此适配器 class 中放置 asyntask 方法,因为我想将按钮名称 "Request" 更改为 "Sent" 在 onPostExecute 方法中发送请求后。我手动更改了按钮名称,但我想确保用户已 100% 发送该请求。所以请告诉我必须在此适配器 class 中放置 asynctask 方法的位置,以便我可以更改按钮名称。百万提前致谢。
package project.cc.student;
import java.util.ArrayList;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import com.example.connectifyclassroom.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;
}
}
添加另一个 属性 到 contactList
说 buttonText
buttonText 的默认文本将为 "Request",单击时将其更改为 "send" 并调用 notifyDataSet();
关于 Web 服务对项目 clickListener 的响应,只需使用这些
holder.btSendRequest.setText("Sent")
我建议你通过回调来解决这个问题。
为此,创建一个包含方法 onRequestSended 的接口(例如 RequestStatusCallback)。
现在让 SubjectAdapter 实现这个接口。 -> onRequestSended() 改变了按钮的外观。
在 SendRequest 中创建一个 ctor,它需要一个 RequestStatusCallback 实例。将其保存为实例变量。
如果SendRequest发送请求成功,调用回调的onRequestSended方法
因此,只有当请求已发送时,按钮才会更新。 现在您可以添加更多回调,例如 "onRequestFailed()" 等等...
我认为你是 android 的新人。这不是好的解决方案,但它会帮助你。在请求按钮之后,在您的适配器 class 中设置一个线程 3 秒,并在您的项目中创建一个名为 isSend() 的标志。更改发送异步任务 onpost() 方法中的标志。比检查线程中的标志。希望对你有帮助。