Android:更改PagerAdapter中的文本

时间:2016-12-02 04:34:24

标签: android android-viewpager

我有一个调用片段的MainActivity(ReadStory)。 ReadStory有一个使用PagerAdapter的ViewPager。 该页面底部有一个图像和一个TextView。 (此示例仅显示TextView)

所有这些都很有效。

要求当用户触摸/单击TextView时,各个单词以红色突出显示。这也很有效。

我遇到的问题是文本(带有红色高光)显示在下一个屏幕上而不是当前可见屏幕上。 我在TextView上设置了一个onClickListener,它将相关部分设置为红色,然后在TextView上设置文本。

ViewPager加载当前屏幕以及上一屏幕和下一屏幕。 TextView被“附加”到“nextScreen”。

如何在当前屏幕上更改TextView?

我已经搜索了几天的答案,但我似乎无法找到答案。任何帮助将不胜感激。

我的代码 - MainActivity

import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

Button myButton;
ReadStory RS;

// *********************************************************************************************

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

    myButton = (Button) findViewById(R.id.button);
    myButton.setOnClickListener(textViewClickListener);

}

// *********************************************************************************************

private View.OnClickListener textViewClickListener = new View.OnClickListener() {
    public void onClick(View v) {

        int[] mStory_resources = {R.string.S1P0, R.string.S1P1, R.string.S1P2, R.string.S1P3, R.string.S1P4, R.string.S1P5, R.string.S1P6, R.string.S1P7,
                R.string.S1P8, R.string.S1P9, R.string.S1P10, R.string.S1P11};
        int mStoryWords = R.string.S1words;

        RS = new ReadStory();
        Bundle args = new Bundle();
        args.putIntArray("Story", mStory_resources);
        args.putInt("storyWords", mStoryWords);
        RS.setArguments(args);
        FragmentManager fm = getSupportFragmentManager();
        FragmentTransaction ft = fm.beginTransaction();
        ft.addToBackStack("readStory");
        ft.replace(R.id.activity_main, RS);
        ft.commit();

    }
};
// *********************************************************************************************
}

ReadStory

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RelativeLayout;

public class ReadStory extends Fragment {

static String currentString = "";
static String newString = "";
private static final String story = "Story";
private static final String storyWords = "storyWords";
private int[] mStory_resources;
private int mStory_words;

ViewPager viewPager;
CustomSwipeAdapter adapter;

public ReadStory() {
    // Required empty public constructor
}

// *********************************************************************************************

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
        mStory_resources = getArguments().getIntArray(story);
        mStory_words = getArguments().getInt(storyWords);
    }

}

// *********************************************************************************************

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

    final RelativeLayout parent = (RelativeLayout) inflater.inflate(R.layout.read_story, container, false);
    viewPager = (ViewPager) parent.findViewById(R.id.view_pager);
    adapter = new CustomSwipeAdapter(getActivity());

    adapter.story_resources = mStory_resources;
    adapter.story_words = mStory_words;
    viewPager.setAdapter(adapter);

    viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

        }

        @Override
        public void onPageSelected(int position) {
            currentString = getString(mStory_resources[position]);
        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    });

    return parent;

}

// *********************************************************************************************

}

PagerAdapter

import android.content.Context;
import android.os.Build;
import android.support.v4.view.PagerAdapter;
import android.text.Html;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

class CustomSwipeAdapter extends PagerAdapter{

int[] story_resources;
int story_words;
private TextView textView;
private Context ctx;

CustomSwipeAdapter(Context ctx)
{
    this.ctx = ctx;
}

// *********************************************************************************************

@Override
public int getCount() {
    return story_resources.length;
}

// *********************************************************************************************

@Override
public boolean isViewFromObject(View view, Object object) {
    return (view==object);
}

// *********************************************************************************************

@SuppressWarnings("deprecation")                        // Put here as setText is deprecated as of API 16 - Jelly_bean
@Override
public Object instantiateItem(ViewGroup container, int position) {

    LayoutInflater layoutInflater;
    layoutInflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View item_view = layoutInflater.inflate(R.layout.swipe_layout,container,false);
    textView = (TextView) item_view.findViewById(R.id.image_count);
    textView.setText(story_resources[position]);
    textView.setOnClickListener(textViewClickListener);

    container.addView(item_view);
    return item_view;
}

// *********************************************************************************************

@Override
public void destroyItem(ViewGroup container, int position, Object object) {

    container.removeView((RelativeLayout)object);

}

// *********************************************************************************************

@SuppressWarnings("deprecation")                        // Put here as fromHtml is deprecated as of API 24 - N

private View.OnClickListener textViewClickListener = new View.OnClickListener() {
    public void onClick(View v) {

        String patternString = "\\b(" + ctx.getString(story_words) + ")\\b";
        Pattern pattern = Pattern.compile(patternString, Pattern.CASE_INSENSITIVE);
        Matcher matcher = pattern.matcher(ReadStory.currentString);
        StringBuffer bufStr = new StringBuffer();

        while (matcher.find()) {
            String rep = matcher.group();
            matcher.appendReplacement(bufStr, "<font color='#EE0000'>" + rep + "</font>");
        }
        matcher.appendTail(bufStr);
        ReadStory.newString = bufStr.toString();

        int sdk = android.os.Build.VERSION.SDK_INT;
        if(sdk >= Build.VERSION_CODES.N) {
            textView.setText(Html.fromHtml(ReadStory.newString));
        } else {
            textView.setText(Html.fromHtml(ReadStory.newString));
        }

        Toast.makeText(ctx, "Clicked", Toast.LENGTH_LONG).show();
    }
};

// *********************************************************************************************


}

1 个答案:

答案 0 :(得分:1)

使用

_SUCCESS  
._SUCCESS.crc

而不是

((TextView)v).setText(Html.fromHtml(ReadStory.newString));

textView对象存在引用问题,它包含下一项的引用。