如何在Android中合并两个或多个适配器并显示在一个ListView中

4
我需要自定义ListView适配器,以返回Twitter和Facebook的信息流。它们都有自己的XML格式。到目前为止,我一直在单独的Activity中显示它们,现在我计划将两个数据合并并在一个适配器中显示。我听说有一种叫做“Merge Adapters”的概念。可以有人帮我看一下下面发布的代码吗?
文件:FacebookAdapter.java
public class FacebookAdapter extends ArrayAdapter<RssFeedStructure> {
List<RssFeedStructure> imageAndTexts1 = null;

public FacebookAdapter(Activity activity,
        List<RssFeedStructure> imageAndTexts) {
    super(activity, 0, imageAndTexts);
    imageAndTexts1 = imageAndTexts;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    Activity activity = (Activity) getContext();
    LayoutInflater inflater = activity.getLayoutInflater();

    View rowView = inflater.inflate(R.layout.facebookadapter, null);
    TextView textView = (TextView) rowView.findViewById(R.id.feed_text);
    TextView timeFeedText = (TextView) rowView
            .findViewById(R.id.feed_updatetime);
    ImageView imageView = (ImageView) rowView.findViewById(R.id.feed_image);
    try {

        Log.d("rssfeed", "imageAndTexts1.get(position).getImgLink() :: "
                + imageAndTexts1.get(position).getImgLink() + " :: "
                + imageAndTexts1.get(position).getTitle());
        textView.setText(imageAndTexts1.get(position).getDescription());
        SpannableString content = new SpannableString(imageAndTexts1.get(
                position).getPubDate());
        content.setSpan(new UnderlineSpan(), 0, 13, 0);

        timeFeedText.setText(content);
        if (imageAndTexts1.get(position).getImgLink() != null) {

            URL feedImage = new URL(imageAndTexts1.get(position)
                    .getImgLink().toString());
            if (!feedImage.toString().equalsIgnoreCase("null")) {
                HttpURLConnection conn = (HttpURLConnection) feedImage
                        .openConnection();
                InputStream is = conn.getInputStream();
                Bitmap img = BitmapFactory.decodeStream(is);
                imageView.setImageBitmap(img);
            } else {
                imageView.setBackgroundResource(R.drawable.rss_tab_tweets);
            }
        }

    } catch (MalformedURLException e) {

    } catch (IOException e) {

    }

    return rowView;

}
}

文件: FacebookActivity.java

public class FacebookFeeds extends Activity {

/** Called when the activity is first created. */

ListView _rssFeedListView;
List<JSONObject> jobs;
List<RssFeedStructure> rssStr;
private FacebookAdapter _adapter;
String sorti = "";
String mode = "";
//Button sort_Btn;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.listview);
    _rssFeedListView = (ListView) findViewById(R.id.rssfeed_listview);
    RssFeedTask rssTask = new RssFeedTask();
    rssTask.execute();
}

private class RssFeedTask extends AsyncTask<String, Void, String> {
    // private String Content;
    private ProgressDialog Dialog;
    String response = "";

    @Override
    protected void onPreExecute() {
        Dialog = new ProgressDialog(FacebookFeeds.this);
        Dialog.setMessage("Rss Loading...");
        Dialog.show();

    }

    @Override
    protected String doInBackground(String... urls) {
        try {
            String feed = "https://someurl";
            XmlHandler rh = new XmlHandler();
            rssStr = rh.getLatestArticles(feed);
        } catch (Exception e) {
        }
        return response;

    }

    @Override
    protected void onPostExecute(String result) {
        if (rssStr != null) {
            _adapter = new FacebookAdapter(FacebookFeeds.this, rssStr);
            _rssFeedListView.setAdapter(_adapter);
        }
        Dialog.dismiss();
    }
}

}

文件名:TwitterAdapter.java

public class TwitterAdapter extends ArrayAdapter<RssFeedStructure> {
List<RssFeedStructure> imageAndTexts1 = null;

public TwitterAdapter(Activity activity,
        List<RssFeedStructure> imageAndTexts) {
    super(activity, 0, imageAndTexts);
    imageAndTexts1 = imageAndTexts;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    Activity activity = (Activity) getContext();
    LayoutInflater inflater = activity.getLayoutInflater();

    View rowView = inflater.inflate(R.layout.twitteradapter, null);
    TextView textView = (TextView) rowView.findViewById(R.id.feed_text);
    TextView timeFeedText = (TextView) rowView
            .findViewById(R.id.feed_updatetime);
    ImageView imageView = (ImageView) rowView.findViewById(R.id.feed_image);
    try {

        Log.d("rssfeed", "imageAndTexts1.get(position).getImgLink() :: "
                + imageAndTexts1.get(position).getImgLink() + " :: "
                + imageAndTexts1.get(position).getTitle());
        textView.setText(imageAndTexts1.get(position).getTitle());
        SpannableString content = new SpannableString(imageAndTexts1.get(
                position).getPubDate());
        content.setSpan(new UnderlineSpan(), 0, 13, 0);

        timeFeedText.setText(content);
        if (imageAndTexts1.get(position).getImgLink() != null) {

            URL feedImage = new URL(imageAndTexts1.get(position)
                    .getImgLink().toString());
            if (!feedImage.toString().equalsIgnoreCase("null")) {
                HttpURLConnection conn = (HttpURLConnection) feedImage
                        .openConnection();
                InputStream is = conn.getInputStream();
                Bitmap img = BitmapFactory.decodeStream(is);
                imageView.setImageBitmap(img);
            } else {
                imageView.setBackgroundResource(R.drawable.rss_tab_tweets);
            }
        }

    } catch (MalformedURLException e) {

    } catch (IOException e) {

    }

    return rowView;

}
}

文件名:TwitterActivity.java

public class TwitterFeeds extends Activity {

/** Called when the activity is first created. */

ListView _rssFeedListView;
List<JSONObject> jobs;
List<RssFeedStructure> rssStr;
private TwitterAdapter _adapter;
String sorti = "";
String mode = "";
//Button sort_Btn;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.listview);
    _rssFeedListView = (ListView) findViewById(R.id.rssfeed_listview);
    RssFeedTask rssTask = new RssFeedTask();
    rssTask.execute();
}

private class RssFeedTask extends AsyncTask<String, Void, String> {
    // private String Content;
    private ProgressDialog Dialog;
    String response = "";

    @Override
    protected void onPreExecute() {
        Dialog = new ProgressDialog(TwitterFeeds.this);
        Dialog.setMessage("Rss Loading...");
        Dialog.show();

    }

    @Override
    protected String doInBackground(String... urls) {
        try {
            String feed = "https://someurl";
            XmlHandler rh = new XmlHandler();
            rssStr = rh.getLatestArticles(feed);
        } catch (Exception e) {
        }
        return response;

    }

    @Override
    protected void onPostExecute(String result) {
        if (rssStr != null) {
            _adapter = new TwitterAdapter(TwitterFeeds.this,
                    rssStr);
            _rssFeedListView.setAdapter(_adapter);
        }
        Dialog.dismiss();
    }
}

}

我相信这个链接是你问题的答案 https://dev59.com/F18d5IYBdhLWcg3w8WJt - Sayyed Mahdi Hussaini
3个回答

1

0

最简单的选择可能是创建一个巨大的项目数组列表,并在单个列表视图中填充它,也许你可以在列表视图之间分配部分断点,也许你可以设计自定义布局来区分Facebook和Twitter布局。或者你可以使用“github”上的“commonsware”的“mergeadapter”。


0

创建一个新的适配器,类似于FacebookTwitterAdapter,可能需要将两个适配器作为构造函数参数。

  • getViewTypeCount - 返回2(Facebook或Twitter视图之一)
  • getItemViewType - 返回0表示Facebook视图,返回1表示Twitter视图
  • getView - 根据您想要如何显示视图(例如时间轴),返回Facebook或Twitter视图之一

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接