Good design in personal project, sort out and record it

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

  1. 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() {
            ...
        }
    }
  2. Create the data model returned by the request interface

    public class NewsBean {
        public int newsType; // News type
        public String otherParams;
    }
  3. 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;
        }
    }
    
    ...
  4. 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;
            }
        }
    }
  5. 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{
            ...
        }
    }
  6. 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

Posted by shack on Fri, 01 May 2020 21:45:28 -0700