【问题标题】:Add listitems to top while maintaining position在保持位置的同时将列表项添加到顶部
【发布时间】:2014-10-08 14:06:10
【问题描述】:

我正在尝试将新的 Listview 项目添加到顶部,同时保持与添加新项目相同的位置。我试过用这个。

TweetList getItem(int position) {
        return this.tweetList.get(tweetList.getSize() - 1 - position);
    } 

但它总是将顶部位置更改为0。如何在不妨碍项目位置的情况下将项目添加到顶部?

public class TweetArrayAdapter extends ArrayAdapter<Object> implements OnClickListener {

    TextView tweet,twitterUser,twitterMention;
    ImageView profile_picture,tweet_picture;
    View padding;
    TweetList tweetMessageObj;
    ViewHolder holder = null;


    public List<TweetList> tweetList = new ArrayList<TweetList>();


    public void add(TweetList object) {
        tweetList.add(object);
        super.add(object);
    }

    public TweetArrayAdapter(Context context, int textViewResourceId) {
        super(context, textViewResourceId);
    }

    public int getCount() {
        return this.tweetList.size();
    }

    public TweetList getItem(int position) {
        return this.tweetList.get(position);
    }

    @SuppressLint("ViewHolder")
    public View getView(final int position, View convertView, ViewGroup parent) {
        View row = convertView;
            tweetMessageObj = getItem(position);

            if(convertView == null){

            LayoutInflater inflater = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            row = inflater.inflate(R.layout.tweet_list_item, parent, false);
            holder = new ViewHolder();
            holder.twitterUser = (TextView)row.findViewById(R.id.display_name);
            holder.tweet = (TextView) row.findViewById(R.id.display_tweet);
            holder.twitterMention = (TextView)row.findViewById(R.id.display_twitter_mentionname);
            holder.profile_picture = (ImageView)row.findViewById(R.id.profile_picture);
            holder.tweet_picture = (ImageView)row.findViewById(R.id.tweet_image);
            holder.padding = (View)row.findViewById(R.id.view1);
            holder.favorite = (ImageView)row.findViewById(R.id.favorite_button);
            holder.retweet = (ImageView)row.findViewById(R.id.retweet_button);
            holder.reply = (ImageView)row.findViewById(R.id.reply_button);
            holder.favorite.setTag(holder);

             row.setTag(holder);
            }else{
                holder = (ViewHolder)row.getTag();
            }

            SpannableString hashtag = new SpannableString(tweetMessageObj.tweet);
            Matcher matcher = Pattern.compile("@([A-Za-z0-9_-]+)").matcher(hashtag);
            Matcher matcher2 = Pattern.compile("#([A-Za-z0-9_-]+)").matcher(hashtag);
            while (matcher.find())
            {
                hashtag.setSpan(new ForegroundColorSpan(Color.rgb(79, 120, 216)), matcher.start(), matcher.end(), 0);
                hashtag.setSpan(new ClickableSpan() {

                    @Override
                    public void onClick(View widget) {
                        // TODO Auto-generated method stub
                         TextView tv = (TextView)widget;
                         String tags = tv.getText().subSequence(tv.getSelectionStart(),tv.getSelectionEnd()).toString();
                         Toast.makeText(getActivity(), tags,  Toast.LENGTH_LONG).show();
                    }
                    public void updateDrawState(TextPaint ds) {// override updateDrawState
                           ds.setUnderlineText(false); // set to false to remove underline
                        }
                },matcher.start(), matcher.end(), 0);
            }
            while (matcher2.find())
            { hashtag.setSpan(new ForegroundColorSpan(Color.rgb(79, 120, 216)), matcher2.start(), matcher2.end(), 0);
                hashtag.setSpan(new ClickableSpan() {

                    @Override
                    public void onClick(View widget) {
                        // TODO Auto-generated method stub
                        TextView tv = (TextView)widget;
                         String tags = tv.getText().subSequence(tv.getSelectionStart(),tv.getSelectionEnd()).toString();
                         Toast.makeText(getActivity(), tags,  Toast.LENGTH_LONG).show();
                    }
                    public void updateDrawState(TextPaint ds) {// override updateDrawState
                           ds.setUnderlineText(false); // set to false to remove underline
                        }
                },matcher2.start(), matcher2.end(), 0);
            }
            holder.tweet.setText(hashtag, BufferType.SPANNABLE);
            holder.tweet.setMovementMethod(LinkMovementMethod.getInstance());
            holder.tweet.setHighlightColor(Color.TRANSPARENT);
            if(tweetMessageObj.tweet.isEmpty()){
                holder.tweet.setVisibility(View.GONE);
            }
            Typeface tf = Typeface.createFromAsset(getActivity().getAssets(), "fonts/light.ttf");
            holder.tweet.setTypeface(tf);
            Typeface tf2 = Typeface.createFromAsset(getActivity().getAssets(), "fonts/bold.ttf");
            holder.twitterUser.setText(tweetMessageObj.twittername);
            holder.twitterUser.setTypeface(tf2);
            holder.twitterMention.setText("@" + tweetMessageObj.mentionname);

            Picasso.with(getActivity()).load(tweetMessageObj.pictureURL).into(holder.profile_picture);
            if(tweetMessageObj.tweetPictureUrl != null){
                holder.tweet_picture.setVisibility(View.VISIBLE);
                holder.padding.setVisibility(View.VISIBLE);
                Picasso.with(getActivity()).load(tweetMessageObj.tweetPictureUrl).into(holder.tweet_picture);
            }else{
                holder.tweet_picture.setVisibility(View.GONE);
                holder.padding.setVisibility(View.GONE);
            }

        return row;
    }

编辑:

public class TweetArrayAdapter extends ArrayAdapter<Object> implements OnClickListener {

    TextView tweet,twitterUser,twitterMention;
    ImageView profile_picture,tweet_picture;
    View padding;
    TweetList tweetMessageObj;
    ViewHolder holder = null;


    public List<TweetList> tweetList = new ArrayList<TweetList>();


    int index = 0;

    public void add(TweetList object) {
            tweetList.add(index, object);
            index++;
        }

    public TweetArrayAdapter(Context context, int textViewResourceId) {
        super(context, textViewResourceId);
    }

    public int getCount() {
        return this.tweetList.size();
    }

    public TweetList getItem(int position) {
        return tweetList.get(position);
    } 

    @SuppressLint("ViewHolder")
    public View getView(final int position, View convertView, ViewGroup parent) {
        View row = convertView;
            tweetMessageObj = getItem(position);

            if(convertView == null){

            LayoutInflater inflater = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            row = inflater.inflate(R.layout.tweet_list_item, parent, false);
            holder = new ViewHolder();
            holder.twitterUser = (TextView)row.findViewById(R.id.display_name);
            holder.tweet = (TextView) row.findViewById(R.id.display_tweet);
            holder.twitterMention = (TextView)row.findViewById(R.id.display_twitter_mentionname);
            holder.profile_picture = (ImageView)row.findViewById(R.id.profile_picture);
            holder.tweet_picture = (ImageView)row.findViewById(R.id.tweet_image);
            holder.padding = (View)row.findViewById(R.id.view1);
            holder.favorite = (ImageView)row.findViewById(R.id.favorite_button);
            holder.retweet = (ImageView)row.findViewById(R.id.retweet_button);
            holder.reply = (ImageView)row.findViewById(R.id.reply_button);
            holder.favorite.setTag(holder);

             row.setTag(holder);
            }else{
                holder = (ViewHolder)row.getTag();
            }

            holder.favorite.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    Toast.makeText(getContext(), String.valueOf(position), Toast.LENGTH_SHORT).show();
                }
            });
            SpannableString hashtag = new SpannableString(tweetMessageObj.tweet);
            Matcher matcher = Pattern.compile("@([A-Za-z0-9_-]+)").matcher(hashtag);
            Matcher matcher2 = Pattern.compile("#([A-Za-z0-9_-]+)").matcher(hashtag);
            while (matcher.find())
            {
                hashtag.setSpan(new ForegroundColorSpan(Color.rgb(79, 120, 216)), matcher.start(), matcher.end(), 0);
                hashtag.setSpan(new ClickableSpan() {

                    @Override
                    public void onClick(View widget) {
                        // TODO Auto-generated method stub
                         TextView tv = (TextView)widget;
                         String tags = tv.getText().subSequence(tv.getSelectionStart(),tv.getSelectionEnd()).toString();
                         Toast.makeText(getActivity(), tags,  Toast.LENGTH_LONG).show();
                    }
                    public void updateDrawState(TextPaint ds) {// override updateDrawState
                           ds.setUnderlineText(false); // set to false to remove underline
                        }
                },matcher.start(), matcher.end(), 0);
            }
            while (matcher2.find())
            { hashtag.setSpan(new ForegroundColorSpan(Color.rgb(79, 120, 216)), matcher2.start(), matcher2.end(), 0);
                hashtag.setSpan(new ClickableSpan() {

                    @Override
                    public void onClick(View widget) {
                        // TODO Auto-generated method stub
                        TextView tv = (TextView)widget;
                         String tags = tv.getText().subSequence(tv.getSelectionStart(),tv.getSelectionEnd()).toString();
                         Toast.makeText(getActivity(), tags,  Toast.LENGTH_LONG).show();
                    }
                    public void updateDrawState(TextPaint ds) {// override updateDrawState
                           ds.setUnderlineText(false); // set to false to remove underline
                        }
                },matcher2.start(), matcher2.end(), 0);
            }
            holder.tweet.setText(hashtag, BufferType.SPANNABLE);
            holder.tweet.setMovementMethod(LinkMovementMethod.getInstance());
            holder.tweet.setHighlightColor(Color.TRANSPARENT);
            if(tweetMessageObj.tweet.isEmpty()){
                holder.tweet.setVisibility(View.GONE);
            }
            Typeface tf = Typeface.createFromAsset(getActivity().getAssets(), "fonts/light.ttf");
            holder.tweet.setTypeface(tf);
            Typeface tf2 = Typeface.createFromAsset(getActivity().getAssets(), "fonts/bold.ttf");
            holder.twitterUser.setText(tweetMessageObj.twittername);
            holder.twitterUser.setTypeface(tf2);
            holder.twitterMention.setText("@" + tweetMessageObj.mentionname);

            Picasso.with(getActivity()).load(tweetMessageObj.pictureURL).into(holder.profile_picture);
            if(tweetMessageObj.tweetPictureUrl != null){
                holder.tweet_picture.setVisibility(View.VISIBLE);
                holder.padding.setVisibility(View.VISIBLE);
                Picasso.with(getActivity()).load(tweetMessageObj.tweetPictureUrl).into(holder.tweet_picture);
            }else{
                holder.tweet_picture.setVisibility(View.GONE);
                holder.padding.setVisibility(View.GONE);
            }

        return row;
    }

【问题讨论】:

  • 我对你的问题有点困惑。您是说添加新项目时列表视图总是滚动到顶部吗?还是在添加新项目时尝试保持项目的相同索引?
  • 这正是我想要做的 Ryan。
  • 哪一个?哈哈。添加项目时保持滚动位置?
  • 大声笑,对不起。在添加新项目时维护项目的索引。基本上,当我添加一个新项目时,我希望它出现在顶部,但我希望索引保持不变。假设我将 1 个项目添加到列表中,通过选择该项目将是 0。当我使用 return this.tweetList.get(tweetList.getSize() - 1 - position);当我向列表视图添加更多内容时,新的位于位置 0;
  • 如果我有这个权利,您希望能够将一个项目添加到您的列表中,但让它出现在与其列表数据结构中的索引不同的索引处?

标签: android twitter arraylist custom-adapter


【解决方案1】:

我想我理解您想要表达的意思...更简单的方法是在特定索引处添加新项目。试试这个:

public void add(TweetList object, int index) {
        tweetList.add(index, object);
        super.add(index, object);
    }

我认为如果你这样做,你就不必在getItem() 方法中做所有额外的工作。也可以改为:

TweetList getItem(int position) {
        return tweetList.get(position);
    } 

如果您的 List 已经按照您希望它出现在 ListView 中的顺序排列,那么您要做的工作就会减少,而且它也不太容易出错。希望我理解正确,希望对您有所帮助!

编辑:

保留一个变量来保存下一项应该添加的位置的索引..

    private int index = 0;

    public void add(TweetList object) {
            tweetList.add(index, object);
            index++;
        }

这样做会将第一个新项目添加到列表顶部,任何后续项目都将添加到最近添加的新项目之后。

【讨论】:

  • 我想我明白了,我删除了super中的index参数。
  • 嗯,它正在添加到顶部,但位置没有改变。 super.add 不会让我添加索引,所以我会假设这是问题所在。
  • 你的意思是,列表视图的位置没有改变?
  • 除非您有特殊需要,否则我会完全摆脱 super 调用。
  • 好的,我想我可以更好地解释一下。添加到顶部的项目总是成为位置 0。我希望它是第一个列表项是 0,添加到顶部的下一个项目将是 1,之后的下一个项目将是 2,下一个将是3 等等。
【解决方案2】:

你必须操作列表视图

// before adding new elements
int currentPosition = mList.getFirstVisiblePosition();
View child = mList.getChildAt(0);
int top = child == null ? 0 : child.getTop();
//TODO add new elements
mList.setSelectionFromTop(currentPosition + numberOfNewElements, top);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-21
    • 1970-01-01
    • 1970-01-01
    • 2015-01-19
    • 2020-04-06
    • 2013-03-11
    • 1970-01-01
    相关资源
    最近更新 更多