0

だから、私がやりたいことは、カスタム リスト ビュー アダプターを使用してアクティビティにチャットを表示することです。

サーバー側の対話を処理し、JSONObject で応答する HTTPTask アクティビティがあります。したがって、すべてのサーバー側の対話は正常に機能しています。

私がやりたいことは、設定された間隔で API をチェックし続けて、チャットにメッセージがある場合はそれを入力することで、チャット内のメッセージを更新し続けることです。

私の質問は、このポピュレーション プロセスをアダプターまたはアクティビティで実行する必要がありますか?

そして、viewHolder はアダプターでどのように役立ちますか?

これは私のアクティビティです

public class ChatActivity extends Activity {

TextView toUsername;
EditText replyText;
JSONObject resultObject;
StringBuilder reply,from_user_id,c_id;
MessageListViewAdapter myAdapter;
ListView listView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_chat);

    toUsername = (TextView) findViewById(R.id.toUsername);
    replyText = (EditText) findViewById(R.id.replyText);
    reply = new StringBuilder("");
    listView = (ListView) findViewById(R.id.messages);
}

@Override
public void onResume(){
    super.onResume();

    Bundle bundle = getIntent().getExtras();
    if(bundle != null){
        toUsername.setText("" + bundle.get("ToUsername").toString());
        c_id = new StringBuilder(bundle.get("c_id").toString());
        from_user_id = new StringBuilder(bundle.get("FromUserId").toString());
    }

    myAdapter = new MessageListViewAdapter(getBaseContext(),c_id.toString(),from_user_id.toString());
    listView.setAdapter(myAdapter);
}

public void sendTextMsg(View view){
    reply.delete(0,reply.length());
    reply.append(replyText.getText().toString());
    if(!reply.toString().equals("")){
        Log.d("Values: ","c_id: " + c_id.toString() + " FromUserId: " + from_user_id.toString() + "ReplyText: " + reply.toString());

        try{
            resultObject = new HttpTask(getBaseContext()).doInBackground("replyInChat",c_id.toString(),replyText.getText().toString(),from_user_id.toString());
            if(resultObject.get("status").toString().equals("true")) {
                Toast.makeText(getBaseContext(), "Sent.", Toast.LENGTH_SHORT).show();
                replyText.setText("");
            }
            else {
                Toast.makeText(getBaseContext(), "Try Again.", Toast.LENGTH_SHORT).show();
            }
        }
        catch(JSONException e){ }

    }
}
}

アダプターが機能していないようです。

public class MessageListViewAdapter extends BaseAdapter implements ListAdapter{

private ArrayList<String> list = new ArrayList<String>();
private Context context;
private StringBuilder conversation_id, user_id;
private static int cr_id;
private JSONArray messages;
private JSONObject resultObject;
private ViewHolder viewHolder;
private View rowView;

public MessageListViewAdapter(Context context, String conversation_id, String user_id) {
    this.context = context;
    this.conversation_id = new StringBuilder(conversation_id.toString());
    this.user_id = new StringBuilder(user_id.toString());
    cr_id=0;
}

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

@Override
public Object getItem(int pos) {
    return list.get(pos);
}

@Override
public long getItemId(int pos) {
    //return list.get(pos).getId();
    //just return 0 if your list items do not have an Id variable.
    return 0;
}

@Override
public boolean isEnabled(int position){
    return false;
}

static class ViewHolder{
    public TextView ItemText;
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    rowView = convertView;

    if (rowView == null) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        rowView = inflater.inflate(R.layout.message_list_layout, null);
        //configure view holder
        viewHolder = new ViewHolder();
        viewHolder.ItemText = (TextView) rowView.findViewById(R.id.list_item_text);
        rowView.setTag(viewHolder);
    }
    else {
        //fill data
        viewHolder = (ViewHolder) rowView.getTag();
    }

    try{
        Log.d("cr_id: ",String.valueOf(cr_id).toString());
        //This is where the population should've taken place but didn't.
        resultObject = new HttpTask(context).doInBackground("sendMessages",conversation_id.toString(),String.valueOf(cr_id));
        if(resultObject.get("status").toString().equals("true")) {
            messages = resultObject.getJSONArray("messages");
            Log.d("Messages: ",messages.toString());
            for(int i=0;i<=messages.length();i++){
                list.add(messages.getJSONObject(i).get("reply_text").toString());
            }
        }
    }
    catch(JSONException e){ }

    //Handle TextView and display string from your list
    //final TextView listItemText = (TextView)rowView.findViewById(R.id.list_item_text);
    //listItemText.setText(list.get(position));
    viewHolder.ItemText.setText(list.get(position));

    return rowView;
}
}
4

3 に答える 3

0

個人的には、アダプターの外部でネットワーク呼び出しを行います。現在のコードでは、ユーザーがリストを上下にスクロールすると、ネットワーク呼び出しが複数回呼び出されますが、これは望ましくないことです。

より良い解決策は、呼び出しを行うアクティビティ内にメソッドを配置し、そのメソッドを2〜3分ごとに呼び出すタイマーを設定して、ネットワーク呼び出しを節約することです。また、更新ボタンを追加することもできますユーザーは、同じメソッドを呼び出すだけのデータ自体を更新することを選択できます。

ビュー ホルダー デザイン パターンは、リストビューを高速化し、スムーズに保つのに役立ちます。このように考えてください。ページが最初に読み込まれると、リスト ビューを埋めるために getView が何度も呼び出されます。getView メソッドでは、UI ウィジェットをインスタンス化します。つまり、textview = (TextView)findviewbyid です。ビュー ホルダーが行うことは、これらの ui 要素への参照を保持することです。これは、findViewById を呼び出し続ける必要がないことを意味します。

これは、それをもう少しよく説明し、いくつかの例に入る記事です。

http://www.javacodegeeks.com/2013/09/android-viewholder-pattern-example.html

アクティビティでネットワーク コードを実行するとします。応答を受け取ったら、メッセージをリストに追加するだけです。notifyDataSetChanged();

于 2016-01-17T12:05:42.290 に答える
0

それで、最後に、いくつかの実験で動作するようになりました。Manikanta と Andy Joyce の貴重な回答に感謝します。彼らがいなかったら、私は立ち往生していた場所からこれ以上進むことはできなかったでしょう.

これは、カスタム アダプターで変更したものです。

public void add(ArrayList<String> list){
    this.list.clear();
    this.list.addAll(list);
    Log.d("List: ",this.list.toString());
    this.notifyDataSetChanged();
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    rowView = convertView;

    if (rowView == null) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        rowView = inflater.inflate(R.layout.message_list_layout, null);
        //configure view holder
        viewHolder = new ViewHolder();
        viewHolder.ItemText = (TextView) rowView.findViewById(R.id.list_item_text);
        rowView.setTag(viewHolder);
    }

    else {
        //fill data
        viewHolder = (ViewHolder) rowView.getTag();
    }

    viewHolder.ItemText.setText(list.get(position));

    return rowView;
}

これは私が私の活動に追加したものです

    @Override
public void onResume(){
    super.onResume();

    Bundle bundle = getIntent().getExtras();
    if(bundle != null){
        toUsername.setText("" + bundle.get("ToUsername").toString());
        c_id = new StringBuilder(bundle.get("c_id").toString());
        from_user_id = new StringBuilder(bundle.get("FromUserId").toString());
        //list.add(c_id.toString());
        //list.add(from_user_id.toString());
    }

    myAdapter = new MessageListViewAdapter(getBaseContext(),c_id.toString(),from_user_id.toString());
    listView.setAdapter(myAdapter);

    callAsynchronousTask();
    //myAdapter.add(list);
}
@Override
public void onPause(){
    super.onPause();
    timer.cancel();
}
public void callAsynchronousTask() {
    final Handler handler = new Handler();
    timer = new Timer();
    TimerTask doAsynchronousTask = new TimerTask() {
        @Override
        public void run() {
            handler.post(new Runnable() {
                public void run() {
                    //list.clear();
                    try{
                        resultChatObject = new HttpTask(getBaseContext()).doInBackground("sendMessages",c_id.toString(),String.valueOf(cr_id));
                        if(resultChatObject.get("status").toString().equals("true")) {
                            //list.clear();
                            messages = resultChatObject.getJSONArray("messages");
                            Log.d("Messages: ",messages.toString());
                            for (int i = 0; i <= messages.length(); i++) {
                                list.add(messages.getJSONObject(i).get("reply_text").toString());
                                if (cr_id < Integer.parseInt(messages.getJSONObject(i).get("cr_id").toString()))
                                    cr_id = Integer.parseInt(messages.getJSONObject(i).get("cr_id").toString());
                            }
                        }
                    }
                    catch (JSONException e) { }

                    myAdapter.add(list);
                }
            });
        }
    };
    timer.schedule(doAsynchronousTask, 0, 10000); //execute in every 10000 ms
}

みんなで乾杯!!!

于 2016-01-17T18:29:16.413 に答える