Make a record of the better solutions that you have implemented in the project
Specific implementation using pseudo code description
List display of different types of news (policy mode)
Design purpose
There are too many data types. If type judgment and convertView construction of various types are carried out in getView of data display list adapter, a large number of if/else or large switch will cause adapter to be very bloated and difficult to maintain. Therefore, policy mode is used to handle the construction of different types of convertView
Specific implementation
-
Base class BaseNews of new news model
public abstract class BaseNews { protected String publicParams; // Other common parameters // Get the abstract method of ConvertView in adapter abstract View getConvertView(NewsAdapter.ViewHolder viewHolder); protected void otherPublicFunc() { ... } }
-
Create the data model returned by the request interface
public class NewsBean { public int newsType; // News type public String otherParams; }
-
Create subclasses for each type of news
public class SingleImageNews extends BaseNews { private String privateParams; public SingleImageNews(NewsBean newsBean) { initData(); // Initialization data, etc } @Override public View getContentView(NewsAdapter.ViewHolder viewHolder) { ... return singleImageView; } } public class MuiltImageNews extends BaseNews { private String privateParams; public MuiltImageNews (NewsBean newsBean) { initData(); // Initialization data, etc } @Override public View getContentView(NewsAdapter.ViewHolder viewHolder) { ... return muiltImageView; } } ...
-
News factory
public class NewsFactory { public static BaseNews getNews(NewsBean newsBean) { switch (newsBean.newsType) { case 0: return new SingleImageNews(newsBean); case 1: return new MuiltImageNews(newsBean); ... default: return null; } } }
-
News list adapter
public class NewsAdapter extends BaseAdapter { @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder; ... return getItem(position).getContentView(viewholder); // TODO is all about simplifying this } public class ViewHolder{ ... } }
-
Interface callback
private List<NewsBean> newsBeanList; private NewsAdapter newsAdapter; @Override public void onSuccess(List<NewsBean> list) { for(NewsBean newsBean : list) { newsBeanList.add(NewsFactory.getNews(newsBean)); // Using NewsFactory to build different types of News } newsAdapter.notifyDataSetChanged(); }
To be continued