Android开发之TextView垂直显示List列表数据

自定义控件
package com.nskj.zhiyinglicai.myView;

import android.content.Context;

import android.content.res.TypedArray;
import android.graphics.Camera;
import android.graphics.Color;
import android.graphics.Matrix;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.View;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.Animation;
import android.view.animation.Transformation;
import android.widget.TextSwitcher;
import android.widget.TextView;
import android.widget.ViewSwitcher;

import com.nskj.zhiyinglicai.R;


/**
* TODO 向上滚动TextView
*
* @author ZhaoQy
*/
public class ScollViewTextView extends TextSwitcher implements ViewSwitcher.ViewFactory {

private float mHeight ;
private Context mContext ;
// mInUp,mOutUp分别构成向下翻页的进出动画
private Rotate3dAnimation mInUp ;
private Rotate3dAnimation mOutUp ;

// mInDown,mOutDown分别构成向下翻页的进出动画
private Rotate3dAnimation mInDown ;
private Rotate3dAnimation mOutDown ;

public ScollViewTextView(Context context) {
this (context, null );
}

public ScollViewTextView(Context context, AttributeSet attrs) {
super (context, attrs);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable. auto3d );
mHeight = 20 ;
a.recycle();
mContext = context;
init();
}

private void init() {
setFactory( this );
mInUp = createAnim( true , true );
mOutUp = createAnim( false , true );

// TextSwitcher主要用于文件切换,比如 从文字A 切换到 文字 B,
// setInAnimation()后,A将执行inAnimation,
// setOutAnimation()后,B将执行OutAnimation
setInAnimation( mInUp );
setOutAnimation( mOutUp );
}

private Rotate3dAnimation createAnim( boolean turnIn, boolean turnUp) {
final Rotate3dAnimation rotation = new Rotate3dAnimation(turnIn, turnUp);
// 动画持续时间
rotation.setDuration( 300 );
rotation.setFillAfter( false );
rotation.setInterpolator( new AccelerateInterpolator());
return rotation;
}

// 这里返回的TextView,就是我们看到的View
@Override
public View makeView() {
TextView t = new TextView( mContext );
t.setGravity(Gravity. LEFT );
t.setTextSize( 16 );
t.setMaxLines( 1 );
t.setPadding( 0 , 5 , 0 , 5 );
// 设置文字颜色
t.setTextColor(Color. WHITE );
return t;
}

// 定义动作,向下滚动翻页
public void previous() {
if (getInAnimation() != mInDown ) {
setInAnimation( mInDown );
}
if (getOutAnimation() != mOutDown ) {
setOutAnimation( mOutDown );
}
}

// 定义动作,向上滚动翻页
public void next() {
if (getInAnimation() != mInUp ) {
setInAnimation( mInUp );
}
if (getOutAnimation() != mOutUp ) {
setOutAnimation( mOutUp );
}
}

class Rotate3dAnimation extends Animation {
private float mCenterX ;
private float mCenterY ;
private final boolean mTurnIn ;
private final boolean mTurnUp ;
private Camera mCamera ;

public Rotate3dAnimation( boolean turnIn, boolean turnUp) {
mTurnIn = turnIn;
mTurnUp = turnUp;
}

@Override
public void initialize( int width, int height, int parentWidth, int parentHeight) {
super .initialize(width, height, parentWidth, parentHeight);
mCamera = new Camera();
mCenterY = getHeight() / 2 ;
mCenterX = getWidth() / 2 ;
}

@Override
protected void applyTransformation( float interpolatedTime, Transformation t) {

final float centerX = mCenterX ;
final float centerY = mCenterY ;
final Camera camera = mCamera ;
final int derection = mTurnUp ? 1 : - 1 ;

final Matrix matrix = t.getMatrix();

camera.save();
if ( mTurnIn ) {
camera.translate( 0.0f , derection * mCenterY * (interpolatedTime - 1.0f ), 0.0f );
} else {
camera.translate( 0.0f , derection * mCenterY * (interpolatedTime), 0.0f );
}
camera.getMatrix(matrix);
camera.restore();

matrix.preTranslate(-centerX, -centerY);
matrix.postTranslate(centerX, centerY);
}
}
}

xml文件

< LinearLayout
android :layout_width= "match_parent"
android :layout_height= "wrap_content"
android :orientation= "horizontal" >

< com.nskj.zhiyinglicai.myView.ScollViewTextView
android :id= "@+id/tv_integral_draw_message"
android :layout_width= "match_parent"
android :layout_height= "wrap_content"
android :text= ""
android :textStyle= "bold"
android :gravity= "center|left"
android :layout_marginLeft= "10dp"
android :textColor= "@android:color/white"
android :orientation= "vertical" />

</ LinearLayout >


JavaBean文件

import java.io.Serializable;

public class DrawMessage implements Serializable {
private String name ;
private String message ;

public DrawMessage() {
}

public DrawMessage(String name, String message) {
this . name = name;
this . message = message;
}

public String getName() {
return name ;
}

public void setName(String name) {
this . name = name;
}

public String getMessage() {
return message ;
}

public void setMessage(String message) {
this . message = message;
}
}

activity中应用

public class IntegralDrawActivity extends CommonActivity {
private List<DrawMessage> drawMessageList ;
private int mTextCount ;
private Handler mHandler = new Handler();
List<String> list ;

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

public void initView(){
drawMessageList = new ArrayList<>();
drawMessageList .add( new DrawMessage( "陌xx" , "电视机" ));
drawMessageList .add( new DrawMessage( "陌78" , "电视机4259" ));
drawMessageList .add( new DrawMessage( "陌37656" , "电视45686机" ));
drawMessageList .add( new DrawMessage( "陌15638+" , "电576视机" ));

for ( int i = 0 ; i < drawMessageList .size(); i++){
String str = drawMessageList .get(i).getName() + ":获得" + drawMessageList .get(i).getMessage();
list .add(str);
}
mTextCount = list .size();
mHandler .postDelayed( runnable , 2000 );
}
Runnable runnable = new Runnable() {
@Override
public void run() {
tv_integral_draw_message .next();
mTextCount ++;
if ( mTextCount >= Integer. MAX_VALUE ){
mTextCount = list .size();
}
tv_integral_draw_message .setText( list .get( mTextCount % ( list .size())));
if ( list .size() > 1 ) {
mHandler .postDelayed( this , 2000 );
}

}
};
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用 RecyclerView 控件,然后在适配器中使用 GridLayoutManager 设置为每行一个 item。具体的实现可以参考以下代码: 1. 在布局文件中添加 RecyclerView 控件,设置为 match_parent: ```xml <androidx.recyclerview.widget.RecyclerView android:id="@+id/list" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" /> ``` 2. 在代码中设置 RecyclerView 的 LayoutManager 和 Adapter: ```java RecyclerView recyclerView = findViewById(R.id.list); recyclerView.setLayoutManager(new GridLayoutManager(this, 1, GridLayoutManager.VERTICAL, false)); recyclerView.setAdapter(new MyAdapter(this, data)); ``` 其中 GridLayoutManager 的第一个参数表示列数,因为要每行只显示一个 item,所以设置为 1;第三个参数表示方向,这里设置为垂直方向。 3. 定义 Adapter: ```java class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { private Context context; private List<String> data; public MyAdapter(Context context, List<String> data) { this.context = context; this.data = data; } @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(context).inflate(R.layout.item_view, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { holder.text.setText(data.get(position)); } @Override public int getItemCount() { return data.size(); } class ViewHolder extends RecyclerView.ViewHolder { TextView text; ViewHolder(@NonNull View itemView) { super(itemView); text = itemView.findViewById(R.id.text); } } } ``` 其中 item_view.xml 是每个 item 的布局文件,这里只需要一个 TextView。 这样就可以实现每行只显示一个 item 的效果了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值